LinuxSir.cn,穿越时空的Linuxsir!

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

[求助]Linux进程管理

[复制链接]
发表于 2005-6-11 23:01:46 | 显示全部楼层 |阅读模式
Linux下的进程管理
这个程序本来是要输入一个信号后启动进程
然后输出:
child process 1 is killed by parent!
child process 2 is killed by parent!
parent process is killed!

但信号发出后(用键盘),程序接收不到
这是什么原因?
大家一起探讨一下
大家讨论一下这是为什么啊?
  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <unistd.h>

  4. void waiting();
  5. void stop();
  6. int wait_mark;

  7. main(){
  8.         int p1,p2;
  9.         while((p1=fork())==-1);
  10.         if(p1>0)
  11.                 {
  12.                         while((p2=fork())==-1);
  13.                         if(p2>0){
  14.                                         wait_mark=1;
  15.                                         signal(SIGINT,stop);
  16.                                         waiting();
  17.                                         kill(p1,16);
  18.                                         kill(p2,17);
  19.                                         wait(0);
  20.                                         wait(0);
  21.                                         printf("parent is killed!\n");
  22.                                         exit(0);
  23.                                         }
  24.                         else{
  25.                                         wait_mark=1;
  26.                                         signal(17,stop);
  27.                                         waiting();
  28.                                         lockf(stdout,1,0);
  29.                                         printf("child 2 is killed by parent!\n");
  30.                                         lockf(stdout,0,0);
  31.                                         exit(0);
  32.                                         }
  33.                 }
  34.         else{
  35.                         wait_mark=1;
  36.                         signal(16,stop);
  37.                         waiting();
  38.                         lockf(stdout,1,0);
  39.                         printf("child process 1 is killed by parent!\n");
  40.                         lockf(stdout,0,0);
  41.                         exit(0);
  42.                 }
  43.         }

  44. void waiting(){
  45.                 while(wait_mark!=0);
  46.                                 }
  47. void stop(){
  48.                         wait_mark=0;
  49. }
复制代码
发表于 2005-6-12 09:43:06 | 显示全部楼层
你的程序没有问题,关键在于你发SIGINT的方式,你用键盘发,你是指  Ctrl + C 吧?
这样的话,你的前台的进程组都会收到 SIGINT 的, 也就是说不只是 P1 , P2和P3也
同时收到了你用  Ctrl+ C 发的 SIGINT 信号。这导致了还没打印,程序已经被结束了。
       你可以在运行程序以后 , 使用 ps -ef 查找你的P1的进程号,然后单独给P1发一个
信号   kill   -2   pid-of-P1   ,就可以了
回复 支持 反对

使用道具 举报

发表于 2005-6-12 09:45:24 | 显示全部楼层
还有一点,最好别用那么多的数字,用定义过的信号名好一些,数字看起来太累
信号的handler一般原型用   void stop(int signo) 好一些
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-12 23:05:34 | 显示全部楼层
Good!

Thanks
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-12 23:20:03 | 显示全部楼层
根据楼上的指点我又做了一下修改
加了两句来忽略子进程接受SIGINT信号
现在用Ctrl+C就可以达到要求了
呵呵

再次感谢!
  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <unistd.h>

  4. void waiting();
  5. void stop();
  6. int wait_mark;

  7. main(){
  8.         int p1,p2;
  9.         while((p1=fork())==-1);
  10.         if(p1>0)
  11.                 {
  12.                         while((p2=fork())==-1);
  13.                         if(p2>0){
  14.                                         wait_mark=1;
  15.                                         signal(SIGINT,stop);
  16.                                         waiting();
  17.                                         kill(p1,16);
  18.                                         kill(p2,17);
  19.                                         wait(0);
  20.                                         wait(0);
  21.                                         printf("parent is killed!\n");
  22.                                         exit(0);
  23.                                         }
  24.                         else{
  25.                                                          [color=Red] signal(SIGINT,SIG_IGN);[/color]                                        wait_mark=1;
  26.                                         signal(17,stop);
  27.                                         waiting();
  28.                                         lockf(stdout,1,0);
  29.                                         printf("child 2 is killed by parent!\n");
  30.                                         lockf(stdout,0,0);
  31.                                         exit(0);
  32.                                         }
  33.                 }
  34.         else{
  35.                           [color=Red]signal(SIGINT,SIG_IGN);[/color]
  36.                                                 wait_mark=1;
  37.                         signal(16,stop);
  38.                         waiting();
  39.                         lockf(stdout,1,0);
  40.                         printf("child process 1 is killed by parent!\n");
  41.                         lockf(stdout,0,0);
  42.                         exit(0);
  43.                 }
  44.         }

  45. void waiting(){
  46.                 while(wait_mark!=0);
  47.                                 }
  48. void stop(){
  49.                         wait_mark=0;
  50. }


复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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