2023/2/27 进程的创建与回收:
1.waitpid能否回收兄弟进程
#include "head.h"
int main(int argc, const char *argv[])
{
pid_t cpid1,cpid2;
//子进程1
cpid1 = fork();
if(0 == cpid1)
{
printf("子进程1开始\n");
printf("pid = %d,cpid = %d %d\n",getpid(),getppid(),__LINE__);
printf("子进程1结束\n");
exit(0);
}else if(cpid1 > 0)
{
//子进程2
cpid2 = fork();
if(0 == cpid2)
{
printf("子进程2开始\n");
printf("pid = %d,cpid = %d %d\n",getpid(),getppid(),__LINE__);
sleep(3);
int ex_cpid = 0;
ex_cpid = waitpid(cpid1,NULL,0);
if(ex_cpid == cpid1)
{
printf("子进程1回收成功\n");
}else
{
printf("ex_cpid = %d 子进程1回收失败\n",ex_cpid);
}
printf("子进程2结束\n");
exit(0);
}
else if(cpid2 < 0)
{
ERR_MSG("fork2");
return -1;
}
//父进程
sleep(4);
printf("parent: cpid = %d,ppid = %d %d\n",getpid(),getppid(),__LINE__);
waitpid(cpid2,NULL,0);
printf("父进程结束\n");
}else if(cpid1 < 0)
{
ERR_MSG("fork1");
return -1;
}
return 0;
}
2.子能否收父
#include "head.h"
int main(int argc, const char *argv[])
{
pid_t cpid1;
//子进程1
cpid1 = fork();
if(0 == cpid1)
{
printf("子进程1开始\n");
printf("pid = %d,cpid = %d %d\n",getpid(),getppid(),__LINE__);
sleep(3);
int ex_cpid = 0;
ex_cpid = waitpid(getppid(),NULL,0);
if(ex_cpid == getppid())
{
printf("父进程回收成功\n");
}else
{
printf("ex_cpid = %d 父进程回收失败\n",ex_cpid);
}
printf("子进程1结束\n");
exit(0);
}else if(cpid1 > 0)
{
//父进程
printf("parent: cpid = %d,ppid = %d %d\n",getpid(),getppid(),__LINE__);
printf("父进程结束\n");
}else if(cpid1 < 0)
{
ERR_MSG("fork1");
return -1;
}
return 0;
}
waitpid不能回收兄弟进程,子进程不能回收父进程