C0301—2022.0315
进程常规语句
在父进程里调用wait函数,查看效果。整个父进程做了三件事:两次打印、一次调用wait函数。
一、子进程做了死循环。
int pid = 0;
int status = 0;//状态
int res = 0;//wait返回值
pid = fork();
if (pid == 0)
{
cout << "进入子进程逻辑 pid=" << getpid() << endl;
for (int i = 0; i >-1; i++)
{
cout << "子进程 for i=" << i << endl;
sleep(2);//防止打印太快
}
}
else if (pid>0)
{
cout << "进入父进程逻辑 pid=" << getpid() << endl;
res = wait(&status);
cout << "wait后 父进程"<< endl;
}
因VS return打了断点结束不了,故用linux内核编译运行。
生成—重新生成解决方案
到Ubuntu里找到工程所在文件夹,右击 在终端打开
编译运行发现
(1)子进程一直在死循环
(2)父进程只做了第一步,且处于睡眠可唤醒状态。
wait等待子进程结束后再有返回值,此例子子进程是个死循环。
二、子进程循环可以结束,观察父进程调用wait函数后是什么情况
int pid = 0;
int status = 0;//状态
int res = 0;//wait返回值
pid = fork();
if (pid == 0)
{
cout << "进入子进程逻辑 pid=" << getpid() << endl;
for (int i = 0; i <10; i++)
{
cout << "子进程 for i=" << i << endl;
sleep(2);
}
}
else if (pid>0)
{
cout << "进入父进程逻辑 pid=" << getpid() << endl;
res = wait(&status);
cout << "wait后 父进程 res="<<res<< endl;
}
编译运行后,循环中
子进程循环结束后,可以看到,父进程打印了调用wait函数后的语句。说明子进程循环结束后,wait函数返回子进程的ID,然后再接着打印后面的语句。
由此可知,wait函数起阻塞的作用,子进程运行结束后,再返回子进程ID,接着下面的操作。
可以解决,子进程先于父进程结束,造成僵尸进程的问题。