LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2496|回复: 12

父进程怎么才能让所有的子进程退出僵尸状态?

[复制链接]
发表于 2004-12-14 22:42:37 | 显示全部楼层 |阅读模式
如果父进程创建了很多子进程,而且子进程的结束顺序是未知的,
那么当子进程接受的时候,父进程怎样才能调用wait()或waitpid()让子进程退出僵尸状态呢?
发表于 2004-12-15 09:07:26 | 显示全部楼层
关心SIGCHLD信号并在信号处理函数中调用wait
 楼主| 发表于 2004-12-17 01:33:06 | 显示全部楼层
这样子好像有时候会不行吧。比如说:shell一下子运行了很多程序,但是shell不能在接受到SIGCHLD信号的时候才调用wait()。因为这个时候,shell运行命令的时候应该阻塞才对的啊。
用上面的方法,shell会开始标准输入中读数据,这样会影响在上面运行的程序的执行。
发表于 2004-12-17 08:53:58 | 显示全部楼层
为什么?没看明白。这跟shell从哪读数据有什么关系?
 楼主| 发表于 2004-12-17 10:21:30 | 显示全部楼层
我是在编一个shell,我现在遇到的问题是如果shell运行了很多的命令,shell就必须调用wait()或waitpid()等待子进程。可是shell上有进程运行的时候,shell应该是处于阻塞状态直到所有运行的命令退出。我想shell应该是调用了wait()或waitpid()来阻塞自己的吧。如果是接受了SIGCHLD信号,然后再调用wait()或waitpid()就没法阻塞自己知道所有的命令退出了。
比如说我在/dev目录下运行了ls|more。当ls|more在运行的时候,shell应该被阻塞,否则shell就会从标准输入中读数据,这样more就不能从标准输入得到数据了。可是ls,more这两个命令退出的顺序是未定的,可能使ls输出完所有的文件先退出,也可能是more得到q命令先退出。所以我不知道该怎么调用waitpid()让这两个命令都退出僵尸状态。这里考虑到作业处理所以我想用waitpid()来等待命令退出
发表于 2004-12-17 12:33:32 | 显示全部楼层
我说在信号处理函数中调wait本来就是为了不让shell阻塞,我觉得shell执行命令的时候是不应该阻塞的。

关于shell的内部机制俺不了解,你可以去参考一下shell的源码。
 楼主| 发表于 2004-12-17 18:49:17 | 显示全部楼层
像bash shell也太复杂了,我根本就不知道该到哪里找
发表于 2004-12-18 21:49:45 | 显示全部楼层
最简单的 shell 我倒是写过,就是以前不知道 cd 是内部命令,所以没有加入 cd 等。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2004-12-28 09:15:56 | 显示全部楼层
如果父子进程之间不需要同步,可以采用fork两次的技术。由init领养子进程。
发表于 2010-12-31 00:24:12 | 显示全部楼层
while(1)
{
   if(-1 = wait(NULL))
   break;
}
让shell一直阻塞等待,直到没有任何子进程时,wait出错返回-1.
这是我想到的方法,lz可以验证一下是否可行。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表