免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: net_robber
打印 上一主题 下一主题

杀死所有子进程的 两种方法 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-03-09 15:41 |只看该作者
把你的程序简单修改了一下

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <signal.h>
  5. #include <unistd.h>


  6. void fun_kill( int sig )
  7. {
  8.         kill ( 0, SIGKILL );
  9. }

  10. int main( void )
  11. {
  12.     for( int i = 0; i < 3; i++ )
  13.     {
  14.         if( 0 == fork() )
  15.         {
  16.             break;
  17.         }
  18.     }

  19.     if( getpid() == getpgid( 0 ) )
  20.     {
  21.         signal ( SIGTERM, SIG_IGN );
  22.         sleep( 3 );
  23.         kill( 0, SIGTERM );
  24.     }
  25.     else
  26.     {
  27.         while ( 1 )
  28.         {
  29.             printf ( "pid:%d ppid:%d\n", getpid(), getppid() );
  30.             sleep ( 1 );
  31.         }
  32.     }

  33.     printf( "game over\n" );
  34.     return 0;
  35. }
复制代码

论坛徽章:
0
12 [报告]
发表于 2007-03-09 15:46 |只看该作者
原帖由 net_robber 于 2007-3-9 15:15 发表
但是为什么另外一个拥有同样PID的后台进程不被干掉

为什么拥有同样进程的BASH进程没有被干掉?????

这和Man里面解释的不一样啊

不太明白你说的"同样pid的后台进程"是什么意思,也不明白"拥有同样进程的BASH进程"是什么意思,请解释一下:)

l新的进程在shell环境生成后,一般都有setsid的操作,这样它们就不在同一个会话期,当然也不在同一个进程组了,所以shell不会受到kill 0的影响

论坛徽章:
0
13 [报告]
发表于 2007-03-09 18:07 |只看该作者
原帖由 isnowran 于 2007-3-9 15:46 发表

不太明白你说的"同样pid的后台进程"是什么意思,也不明白"拥有同样进程的BASH进程"是什么意思,请解释一下:)

l新的进程在shell环境生成后,一般都有setsid的操作,这样它们就不在同一 ...

大概就是你说的原因

还没有研究这么深入。

论坛徽章:
0
14 [报告]
发表于 2007-03-09 18:13 |只看该作者
getpid(), getppid()以前没有用过,学习一下再来讨论

论坛徽章:
0
15 [报告]
发表于 2007-03-09 18:43 |只看该作者
最终提供两套代码:
一套通过gid控制;
另一讨使用SHELL工作。

论坛徽章:
0
16 [报告]
发表于 2007-03-09 18:45 |只看该作者
这是通过gid控制




  1.        #include <stdio.h>
  2.        #include <stdlib.h>
  3.        #include <sys/types.h>
  4.        #include <signal.h>
  5.        #include <unistd.h>
  6.        #include <string.h>
  7.       
  8.        void fun(int sig)
  9.        {
  10.               kill(0 , SIGKILL );
  11.       }
  12.      
  13.       int main( void )
  14.       {
  15.               int pid = 0;
  16.      
  17.               if( pid = fork() )
  18.               {
  19.                       fflush( stdout );
  20.                       sleep ( 5 );
  21.                       printf ( "kill ( pid, SIG ); \n");
  22.                       fflush( stdout );
  23.                       kill ( pid, SIGUSR1 );
  24.                       sleep ( 10 );
  25.                       printf ( "the father is still alive!\n", pid );
  26.                       fflush( stdout );
  27.               }
  28.               else
  29.               {
  30.                       setpgid(0,0);      //line 30
  31.                       signal( SIGUSR1, fun );
  32.                       if( pid = fork() )
  33.                       {
  34.                               int i = 10;
  35.                               while ( i-- )
  36.                               {
  37.                                       fflush( stdout );
  38.                                       sleep ( 1 );
  39.                               }
  40.                       }
  41.                       else
  42.                       {
  43.                               int i = 10;
  44.                               while ( i-- )
  45.                               {
  46.                                       printf ( "in grandsun , pid= %d\nin grandsun , ppid= %d\n", getpid(), getppid() );
  47.                                       fflush( stdout );
  48.                                       sleep ( 1 );
  49.                               }
  50.                       }
  51.               }
  52.      
  53.               return 0;
  54.       }


复制代码

[ 本帖最后由 net_robber 于 2007-3-13 10:04 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2007-03-09 18:46 |只看该作者
这是通过SHELL工作



  1.        #include <stdio.h>
  2.        #include <stdlib.h>
  3.        #include <sys/types.h>
  4.        #include <signal.h>
  5.        #include <unistd.h>
  6.        #include <string.h>
  7.       
  8.        void fun_kill( int sig )
  9.        {
  10.               printf( "process with PID %d got a signal!\n", getpid() );
  11.               fflush( stdout );
  12.               char *pre = "ps awx -o \"\%p \%P\"|grep -w ";
  13.               char *post = " | awk \'{ print $1  }\'|xargs kill -9";
  14.      
  15.               char *command = malloc( 1024*sizeof (char) );
  16.               char *c_pid = malloc( 8*sizeof (char) );
  17.               memset ( command, 0, 1024*sizeof(char) );
  18.               memset ( c_pid, 0, 8*sizeof(char) );
  19.               char *a,*b;
  20.               char c;
  21.      
  22.               //get PID string * NOTE: here the string is in a wrong order
  23.               int len = 0;
  24.               int tmp = getpid();
  25.               for ( len = 0; tmp; tmp /= 10   )
  26.               {
  27.                       *( c_pid + len ) = (tmp%10)+'0';
  28.                       len++;
  29.               }
  30.               printf ( "%s has %d char\n", c_pid,len );
  31.               fflush( stdout );
  32.      
  33.               // deal the order
  34.               a = c_pid;
  35.               b = c_pid+len-1;
  36.               printf ("c_pid = %d\n",c_pid);
  37.               printf ("a = %d\n",a);
  38.               printf ("b = %d\n",b);
  39.               fflush( stdout );
  40.      
  41.      
  42.               while ( a < b )
  43.               {
  44.                       c = *a;
  45.                       *a =*b;
  46.                       *b = c;
  47.                       a += sizeof(char);
  48.                       b -= sizeof(char);
  49.               }
  50.       /*
  51.               int i = 0;
  52.               while ( i<len )
  53.               {
  54.                       printf ("%c", *(c_pid+i) );
  55.               }
  56.       */
  57.      
  58.               printf ( "command1:%s\n", command );
  59.               fflush( stdout );
  60.      
  61.      
  62.               strcat ( command, pre );
  63.               strcat ( command, c_pid );
  64.               strcat ( command, post );
  65.               printf ( "command2:%s\n", command );
  66.               fflush( stdout );
  67.      
  68.            system( command );
  69.      
  70.       }
  71.      
  72.      
  73.      
  74.       int main( void )
  75.       {
  76.               int pid = 0;
  77.      
  78.               if( pid = fork() )
  79.               {
  80.       //              printf ( "in father, pid= %d\nin father, child pid = %d\n", getpid(), pid );
  81.                       fflush( stdout );
  82.                       sleep ( 5 );
  83.                       printf ( "kill ( pid, SIG ); \n");
  84.                       fflush( stdout );
  85.                       kill ( pid, SIGUSR1 );
  86.                       sleep ( 10 );
  87.                       printf ( "the father is still alive!\n", pid );
  88.                       fflush( stdout );
  89.               }
  90.               else
  91.               {
  92.                       signal ( SIGUSR1, fun_kill );
  93.                       if( pid = fork() )
  94.                       {
  95.                               int i = 10;
  96.                               while ( i-- )
  97.                               {
  98.       //                              printf ( "in child, pid= %d\nin child, ppid= %d\n", getpid(), getppid() );
  99.                                       fflush( stdout );
  100.                                      sleep ( 1 );
  101.                               }
  102.                       }
  103.                      else
  104.                      {
  105.                              int i = 10;
  106.                              while ( i-- )
  107.                              {
  108.      //                              printf ( "in grandsun , pid= %d\nin grandsun , ppid= %d\n", getpid(), getppid() );
  109.                                      fflush( stdout );
  110.                                      sleep ( 1 );
  111.                              }
  112.                      }
  113.              }
  114.    
  115.              return 0;
  116.      }
  117.    



复制代码

[ 本帖最后由 net_robber 于 2007-3-13 10:07 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2007-03-12 09:58 |只看该作者
关于使用PGID的方法

请注意代码的第30行

这里需要说明:
setpgid函数后,本进程不再使用父进程的gid
其后,本进程产生的子进程使用本进程setpgid以后的gid


因此可以做到 SIGKILL后杀死本进程及本进程的所有子进程

论坛徽章:
0
19 [报告]
发表于 2007-03-12 10:26 |只看该作者
2个问题
1。生成进程后马上杀掉进程,这么做好像没什么意义,毕竟搂长的初衷是怎么杀掉所有子进程,此时应该父进程应该是已经生成一堆进程后并且没有保存子进程pid的情况

2。既然是指定pid单独发送信号,子进程再设置为组长好像没什么意义

论坛徽章:
0
20 [报告]
发表于 2007-03-12 10:34 |只看该作者
前几天,有个兄弟踢出了一个要杀掉所有子进程的问题

我当时作出了一些回答,但是并没有帮他完全解决问题。

所以,这里,我尝试把这个问题彻底解决

上面的代码只是一个DEMO。


谢谢关注,呵呵

只是不知道,当初提出这个问题的那位 兄弟(沙发),有没有看到这个帖子。

如果看到了,希望告知,我得方法能不能帮你解决问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP