linux下進程的api
- fork
- wait
- exec
fork
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>/*
linux環境運行
子進程并不是完全拷貝了父進程。具體來說,雖然它擁有自己的
地址空間(即擁有自己的私有內存)、寄存器、程序計數器等,但是它從 fork()返回的值是
不同的。父進程獲得的返回值是新創建子進程的 PID,而子進程獲得的返回值是 0。這個差
別非常重要,因為這樣就很容易編寫代碼處理兩種我同的情況(像上面那樣)。
*/int main(int argc, char *argv[])
{printf("hello world (pid:%d)\n", (int)getpid());int rc = fork();if (rc < 0){fprintf(stderr, "fork failed\n");exit(1);}else if (rc == 0) // 子進程{printf("hello, I am child(pid:%d)\n", (int)getpid());}else // 父進程{printf("hello, I am parent of %d (pid:%d)\n", rc, (int)getpid());}return 0;
}
運行結果
wait
// 在父進程的邏輯中增加這兩行就行
#include <sys/wait.h>int wc = wait(NULL);
-------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>/*
linux環境運行
子進程并不是完全拷貝了父進程。具體來說,雖然它擁有自己的
地址空間(即擁有自己的私有內存)、寄存器、程序計數器等,但是它從 fork()返回的值是
不同的。父進程獲得的返回值是新創建子進程的 PID,而子進程獲得的返回值是 0。這個差
別非常重要,因為這樣就很容易編寫代碼處理兩種我同的情況(像上面那樣)。
*/int main(int argc, char *argv[])
{printf("hello world (pid:%d)\n", (int)getpid());int rc = fork();if (rc < 0){fprintf(stderr, "fork failed\n");exit(1);}else if (rc == 0) // 子進程{printf("hello, I am child(pid:%d)\n", (int)getpid());}else // 父進程{ int wc = wait(NULL);printf("hello, I am parent of %d (pid:%d)\n", rc, (int)getpid());}return 0;
}
exec
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>/*
linux環境運行
子進程并不是完全拷貝了父進程。具體來說,雖然它擁有自己的
地址空間(即擁有自己的私有內存)、寄存器、程序計數器等,但是它從 fork()返回的值是
不同的。父進程獲得的返回值是新創建子進程的 PID,而子進程獲得的返回值是 0。這個差
別非常重要,因為這樣就很容易編寫代碼處理兩種我同的情況(像上面那樣)。
*/int main(int argc, char *argv[])
{printf("hello world (pid:%d)\n", (int)getpid());int rc = fork();if (rc < 0){fprintf(stderr, "fork failed\n");exit(1);}else if (rc == 0) // 子進程{printf("hello, I am child(pid:%d)\n", (int)getpid());char *myargs[3];myargs[0] = strdup("wc"); // 就是復制myargs[1] = strdup("p3.c");myargs[2] = NULL;execvp(myargs[0],myargs); // 表示 wc p3.c 告訴我我該文件有多少行、多少單詞,以及多少字節printf("this shouldn't print out");}else // 父進程{printf("hello, I am parent of %d (pid:%d)\n", rc, (int)getpid());}return 0;
}