linux父进程创建两个子进程

已举报 回答 关注

linux父进程创建两个子进程

  • 回答数

    5

  • 浏览数

    9,866

5个回答 默认排序
  • 默认排序
  • 按时间排序

已采纳
#include"stdio.h"
#include"stdlib.h" //exit包含在stdlib.h头文件中
#include"unistd.h"
int main(void)
{
pid_t pid1,pid2;
pid1=fork();
switch(pid1)
{
case 0: //进程创建成功,返回值为0
printf("b"); //子进程1创建成功,输出b
break;
case -1:
printf("Process creation failed\n");//子进程创建失败,输出错误信息
break;
default:
printf("a");//此时执行父进程,输出a
sleep(1);
exit(0);
break;
}
pid2=fork();
switch(pid2)
{
case 0: //进程创建成功,返回值为0
printf("c"); //子进程2创建成功,输出c
break;
case -1:
printf("Process creation failed\n");//子进程创建失败,输出错误信息
exit(0);
break;
default:
printf("a");//此时执行父进程,输出a
//sleep(1);
exit(0);
break;
}
exit(0);
}
取消 评论
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int i=2;
int pid=0;
printf("father id=%ld\n",getpid());
while(i-->0){
pid = fork();
if(pid==0){
printf("son id=%ld\n",getpid());
return 0;
}
}

return 0;
}
取消 评论
可以考虑使用pkill -P ppid命令。
取消 评论
父进程未结束,子进程先结束,会产生僵尸进程。
子进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用 exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。
即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。
僵尸进程的避免:
(1) 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。
(2) 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父
进程会收到该信号,可以在handler中调用wait回收。
(3) 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN) 通知内
核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送
信号。
(4) 还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一 个孙进
程后退出,那么孙进程被init接管,孙进程结束后, init会回收。不过子进程的回收 还要自己
做。
建议你使用第三种方法,父进程直接忽略子进程的结束,留给内核作回收处理。这样就不
会产生僵尸进程。
取消 评论
有更简单的方法,不用fork派生,直接用系统调用启动新的进程,至于需要继承的资源,考虑用写文件的方式进行过继
取消 评论
ZOL问答 > linux父进程创建两个子进程

举报

感谢您为社区的和谐贡献力量请选择举报类型

举报成功

经过核实后将会做出处理
感谢您为社区和谐做出贡献

提示

确定要取消此次报名,退出该活动?