fork()后,子进程复制了父进程的代码段,数据段和堆栈段。以前,我一直以为代码段是从头复制到fork()函数处,再加上if(pid == 0){}的代码段,后来用到了fork()函数,发现我错了。fork()后,子进程将父进程的全部代码段,包括fork()以后的代码段全部复制了。
测试程序:
#include
int main()
{
int pid;
if((pid = fork()) < 0)
{
perror("fork()\n");
}
else if(0 == pid)
{
printf("child process\n");
}
else if(pid > 0)
{
printf("parent process\n");
}
printf("child or parent?\n"); //这句话会打印几遍?
return 0;
}
上面的程序中child or parent?会打印两遍,这就说明子进程复制了父进程的全部代码段。另外shell提示符只打印一次,由于父子进程执行的先后顺序,shell提示符打印有错乱的感觉,自己试一下。可能会出现这样的情况:父进程执行完以后,打印shell提示符,然后在执行子进程。
我们大多数的想法是子进程只执行if(0 ==pid){}的代码段,以后的代码段子进程不执行,为了达到这个目的,在if(0 ==pid){}代码段的最后加上exit(0),记住不可以家return0 ,return 0 只是退出一个函数,可能碰巧是主函数,也有可能是子函数。所以用exit(0)结束本进程。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。