CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

帮忙给看看C程序吧:子进程没有立即结束是正常的吗?

楼主autoapple(自动苹果)2006-03-16 09:57:03 在 Linux/Unix社区 / 程序开发区 提问

父进程启动了若干个子进程,然后我在程序运行期间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

相关问题

  • 敬请关注;关于系统进程的c 语言程序
  • 程序正常关闭后为何进程中还有该程序,怎么彻底退出应用程序呢?
  • 如何让我的 C# 程序 向另一个进程窗口发送消息?
  • C#的小程序,占了10兆内存,正常吗??
  • 奇怪的问题:我写了一个有关进程的程序,在"我的电脑"中的C,D,E,F磁盘中均正常运行,但到桌面就不能运行,请高人指点!
  • ~◎大虾们,在linux下怎么得到一个进程的cpu mem的使用情况,用从c/c++程序!
  • c源程序。
  • C++程序
  • 不能link(编译正常)的Windows API c 源程序希望帮忙
  • 请问这样配置的C程序能不能在AT89C2051中正常执行

关键词

  • 信号
  • 函数
  • 代码
  • 执行
  • 进程
  • sigterm
  • sigproc
  • sendsigntochild
  • boexitcmd
  • kill

得分解答快速导航

  • 帖主:autoapple
  • x86

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo