帮忙给看看C程序吧:子进程没有立即结束是正常的吗?
父进程启动了若干个子进程,然后我在程序运行期间kill 父进程id,当父进程接到SIGTERM信号时,会执行语句,KILL掉子进程。
大体的代码如下:
父进程代码:
...
fork();/*生成子进程*/
...
signal(SIGTERM, SigProc);
if (g_boExitCmd ) {
SendSignToChild();
}
/*信号处理函数*/
void SigProc(int sig) {
if (sig == SIGTERM) {
g_boExitCmd = true;
signal(SIGTERM, SigProc);
}
}
bool SendSignToChild() {
...
kill(g_stMgr[j].p_info[i].pid, SIGTERM);
...
}
子进程的代码:
#include <signal.h>
int main( int argc, char **argv){
pid_t pid=getpid();
int i;
for(i=0;i<argc;i++){
printf("[%d]argv[%d]:%s\n",pid,i,argv[i]);
sleep(5);
}
exit(0);
}
我在命令行输入 kill 父进程id
打出的log都是正常的,显示了“强制终止”的信息,说明已经正常进入SendSignToChild函数,
而且kill那句话应该也是执行了的。
但是现在子程序还是会继续进行,一直到把所有的参数都打出来。
我不明白的是,执行完kill后子程序是否应该立即结束?
问题点数:50、回复次数:8Top
1 楼alaiyeshi(七宝树八宝饭)回复于 2006-03-16 10:46:53 得分 0
你的屏幕显示未必是顺序准确的Top
2 楼autoapple(自动苹果)回复于 2006-03-16 11:01:19 得分 0
kill父进程id的命令肯定是在子进程执行中发出的。
因为我让子进程每次打出参数都sleep5秒,所以时间还是很充裕的。
现在子进程一直运行到把所有参数都打出。
也就是说在我这句话kill(g_stMgr[j].p_info[i].pid, SIGTERM);执行后
子进程还是没有中止。
这样对吗?Top
3 楼x86(大雪)回复于 2006-03-16 11:17:30 得分 50
fork();/*生成子进程*/
此处如何生成子进程? 是exec出来的么?
你可以确认一下子进程是否收到信号,不妨加上信号处理看看
Top
4 楼YanDong_8212(谢科)回复于 2006-03-16 11:18:00 得分 0
void SigProc(int sig) {
if (sig == SIGTERM) {
g_boExitCmd = true;
signal(SIGTERM, SigProc);
}
}
这儿里面不是死循环吗?Top
5 楼autoapple(自动苹果)回复于 2006-03-16 13:26:07 得分 0
>>fork();/*生成子进程*/
>>此处如何生成子进程? 是exec出来的么?
是execl出来的。
>>你可以确认一下子进程是否收到信号,不妨加上信号处理看看
我在子进程中加上了信号处理,结果子进程没有收到信号。
而且直接在命令行输入kill父进程id或者kill子进程id都不管用,
看起来子进程好像在父进程运行期间怎么也得不到SIGTERM这个信号。
为什么呢?Top
6 楼autoapple(自动苹果)回复于 2006-03-17 15:59:24 得分 0
问题解决了。
我在子程序中加入了下面的语句:
signal(SIGTERM, SigProc);
sighold(SIGTERM);
sigrelse(SIGTERM);
这样kill父进程后,SIGTERM发给了子进程,也能正常进入到信号处理函数里了。
而以前只有signal(SIGTERM, SigProc);就进不到信号处理函数。
那位大侠能给解释一下?
Top
7 楼lanying(蓝鹰)(问个不休)回复于 2006-03-19 18:48:34 得分 0
if (g_boExitCmd ) {
SendSignToChild();
}
是套在循环里的?要不然先执行了,再收到SIGTERM信号,SendSignToChild()岂不是就执行不了了?Top
8 楼fierygnu(va_list)回复于 2006-03-20 15:52:19 得分 0
贴完整代码吧。Top




