Linux中的进程问题,以及exit(0); 和sleep(5);

#include<sys/types.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<wa... #include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <wait.h>
int main()
{
pid_t pid=fork();
if(pid==0)
{
printf("child!!!\n");
sleep(5);
exit(0);
}
if(pid>0)
{
wait(NULL);
printf("father!!!\n");
}
return 0;
}
pid_t pid=fork();为新建个进程
exit(0); 无条件退出
sleep(5); 延迟5秒
运行结果为:
先显示:child!!!
等5秒后显示:father!!!
不理解为啥?还会进入第二个if 等5秒后不应该直接退出main函数吗?
展开
 我来答
dttsw
2018-06-20 · TA获得超过1059个赞
知道小有建树答主
回答量:770
采纳率:88%
帮助的人:303万
展开全部

俺跟你解释一下:

fork是copy一个跟当前进程一模一样的进程,包括当前进程的所有状态(有特殊设置就不会拷贝,如文件标识)。子进程如果不设置新的执行程序,会继续执行fork之后的代码,注意前面提过的copy跟父进程一模一样的代码。

pid==0代表是子进程,因此子进程会执行这段代码:

if(pid==0)
{
    printf("child!!!\n");
    //这里会造成子进程的主线程,main执行线程,阻塞5秒
    sleep(5);
    exit(0);
}

pid > 0 代表是父进程,因此父进程继续执行的代码为:

if(pid>0)
{
    //此处必须等待子进程结束,子进程调用exit(0),时会通知父进程继续执行
    //属于进程间通讯、同步的一个手段之一。那子进程等待5秒被唤醒,执行exit(0)
    //父进程收到通知,获取到子进程的退出状态,继续就会printf,基本也就是等待了5秒
    //然后父进程return 0 等价于exit(0)正常结束
    wait(NULL);//不这样写,父进程直接结束可能会产生僵尸进程,也可能变成孤儿进程由
    //由init进程领养,并正确结束。通用的做法必须wait。根据操作系统以及版本不同处理
    //方式可能不一样,如aix可能就会有僵尸进程产生
    printf("father!!!\n");
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式