int main()
{
int pid;
int data=0;
pid = fork; //用fork创建子进程的话,创建子进程的时候会给子进程划分自己的存储空间,拷贝父进程的一切代码和数据,所以下面代码运行的效果就是,父进程的data和子进程的data是分别两个互不相干的值。
//另外,用fork创建子进程的话,子进程和 父进程的执行顺序时不确定的,是由系统的进程调度来安排的。
pid = vfork; //用vfork创建子进程的话,创建子进程的时候不会给子进程另外划分空间,不拷贝任何东西,直接只用父进程的存储空间,所以下面代码的运行效果就是,父进程的data和子进程的data是用一个data,在子进程中修改data时也就是在修改父进程的data,是同一个,所以父进程的data也会变。
//另外,用vfork创建子进程的话,程序会保证子程序先执行,等子程序结束以后,才执行父进程。
wait(NULL); //这里的wait();很重要,如果没有了wait,在子进程结束以后,还会在ps——进程查看窗口中看到子进程存在,而且会变成僵尸进程——“Z+” ,另外需要提醒的是,变成僵尸进程跟进程结束的方式没有关系,而只看有没有wait,没有wait就会变成僵尸进程
if(pid > 0)
{
while(1)
{
printf("this is father pid:%d,data=%d\n",getpid(),data);
sleep(3);
}
}
else if(pid == 0)
{
while(1)
{
data+=10;
printf(:this is child pid:%d,data=%d\n:,getpid(),data);
sleep(3);
exit(0); //正确的子进程退出应该用这个
return 0; //如果这里使用return结束子进程的话,那么父进程的data值将会错乱。
}
}
}
Linux学习之创建子进程fork和vfork
最新推荐文章于 2023-10-06 08:59:42 发布