回顾
前面讲了 wait 函数
主要两个功能
1 回收子进程的pid 这个必须是父进程进行的
2 调用一次 只能回收一个
继续往下
一 waitpid 函数
waitpid 函数和wait函数 都一个用法
区别是形参多了点
1 先看阻塞的情况 最后形参设置为0
情况 1
如果wpid==0 返回的就是任意的子进程 想象子进程是有限的
一直while 它总会有尽头的 所以 最后返回就是一个 看起来不会那么重复了
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
int main()
{
pid_t a;
a=fork();
if(a>0)
{
while(wt=waitpid(-1,&status,0)!=-1)
{
if(wt==0)
{
continue;
}
printf("huishou is %d\n",wt);
printf("father pid is %d\n",getpid());
}
}
else if(a==0)
{
printf("child pid is %d ppid is %d \n",getpid(),getppid());
}
return 0;
}
情况2
不过 还会发生一种情况 不管 没有 wpid==0 他也会 直接回收一个子进程
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
int main()
{
pid_t a;
a=fork();
if(a>0)
{
while(wt=waitpid(-1,&status,0)!=-1)
{
printf("huishou is %d\n",wt);
printf("father pid is %d\n",getpid());
}
}
else if(a==0)
{
printf("child pid is %d ppid is %d \n",getpid(),getppid());
}
return 0;
}
情况1和2的本质
回归函数的本质 只能满足 回收 子进程的功能就行了
不需要杀死 因为 子进程没有while
返回为1 正常 成功了
如果不阻塞呢 它会乱飞 但是最后还是会收到 子进程信息,但是没必要
第三个参数 WNOHANG 替换 0
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
int main()
{
pid_t a;
a=fork();
if(a>0)
{
while(wt=waitpid(-1,&status,WNOHANG)!=-1)
{
printf("huishou is %d\n",wt);
printf("father pid is %d\n",getpid());
}
}
else if(a==0)
{
printf("child pid is %d ppid is %d \n",getpid(),getppid());
}
return 0;
}
二 vfork 函数
两者区别 马上出来了
没有拷贝就相当于 是同个东西
拷贝了 就是多个东西
vfork 函数 可以想成一块蛋糕 肯定是爸爸先给你吃好的 你不吃了 爸爸才吃。
三 vfork exit配合使用
exit 函数
如果用break 退出呢
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
int main()
{
pid_t a;
int fs=0;
a=fork();
if(a>0)
{
while(1)
{
printf("!!!fs=== %d\n",fs);
printf("father pid is %d\n",getpid());
}
}
else if(a==0)
{
while(1)
{
fs+=1;
if(fs==3)
{
break;
}
printf("*****fs=== %d\n",fs);
printf("child pid is %d ppid is %d \n",getpid(),getppid());
}
}
return 0;
}
子进程打印正常 为什么用break 就归零了
它应该是一直打印3的 因为break 突然的退出 父进制并不知道
1 让父进程接收到子进程退出信号的办法
break 可以理解强制退出
改为exit(0);即可
形参赋值随意
```csharp
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
int main()
{
pid_t a;
int fs=0;
a=fork();
if(a>0)
{
while(1)
{
printf("!!!fs=== %d\n",fs);
printf("father pid is %d\n",getpid());
}
}
else if(a==0)
{
while(1)
{
fs+=1;
if(fs==3)
{
exit(0);
}
printf("*****fs=== %d\n",fs);
printf("child pid is %d ppid is %d \n",getpid(),getppid());
}
}
return 0;
}
验证成功
|