由fork产生的新进程叫做子进程,该函数被调用一次,但是返回两次,子进程会返回0,而父进程返回子进程的进程ID。子进程是父进程的复制品,子进程获得父进程数据空间、堆和栈的复制品,这只是子进程的拷贝,父进程不与他共享这些存储空间部分,如果正文段是可读的,那么父子进程只共享正文段。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int glob=6;
char *buf="a write to stdout\n";
int main(void)
{
int val;
pid_t pid;
var=88;
if(write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1){
perror("write error\n");
}
printf("before fork\n");
if((pid=fork())<0){
perror("error\n");
}else if(pid==0){
//child
glob++;
var++;
}else{
//parent
sleep(2);
}
printf("pid=%d, glob=%d, var=%d\n",getpid(),glob,var);
return 0;
}
在这里我们看到父进程先休息2秒,因为内核中父子进程执行的顺序是不确定的,我们先让子进程开始执行,然后父进程执行。