进程创建
fork()
#include <unistd.h> pid_t fork(void);
a)用来创建一个新的进程,调用成功后,将存在两个进程,每个进程都从fork()的返回处继续执行。两个进程执行相同的程序文本段,但各自拥有不同的栈段、数据段和堆段,因为子进程对其父进程的堆段、栈段以及数据段进行了拷贝。
b)fork() 调用成功后,在父进程中返回 子进程的 PID,在子进程中返回 0 。如果调用失败,在父进程中返回 -1,不创建进程。
c)fork() 调用成功创建子进程后,究竟是父进程先于子进程执行,还是子进程先于父进程执行,这取决于内核的调度。编程时应注意。
示例
#include <stdio.h> #include <unistd.h> static int data = 111; int main() { int istack = 222; pid_t pid; switch(pid = fork()) { case -1: perror("creat process failure!"); return -1; case 0://child process data *= 3; istack *= 3; break; default://parent process,do nothing but sleep 3 seconds sleep(3); break; } /*both child and parent come here*/ printf("(%s)my pid is %d data is %d istack is %d\n", (pid == 0) ? "child" : "parent", getpid(), data, istack); return 0; }
运行结果
(child)my pid is 119011 data is 333 istack is 666 (parent)my pid is 119010 data is 111 istack is 222
父进程睡眠 3 秒,保证子进程先执行。数据结果可以看出,子进程拥有自己的栈和对父进程数据段的拷贝。
PS:
将子进程ID(pid)返回给父进程的理由是:因为一个进程的子进程可以多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID。fork() 使子进程返回 0 的理由是:一个进程只会有一个父进程,所以子进程总是可以通过 getppid() 以获得其父进程的进程ID。