日期:2014-05-16  浏览次数:20940 次

关于子进程杀死父进程的问题
现在我需要在子进程中杀死父进程,但是子进程仍然要运行,我试了两种方法,但是都没有达到预期的效果,结果是父进程和子进程,都被杀死了。请高手指点问题在哪里,或者有什么其他的方法,谢谢。
方法1:
  因为有文章介绍说,system调用,本身就创建了一个子进程。于是我写了一个脚本,将父进程的进程号做参数,传进去,脚本这样写的
  sleep 20
  kill $1
  ........
  getty 115200 tty0  
  ......
  在运行脚本后,我ps,看到系统中有脚本的进程,sleep 20 就是为了看看是否有脚本的进程。等大概20秒后,执行kill之后,发现父进程杀死了,但是脚本的进程也被杀死了。这是为什么?

方法2:
  方法一出了问题,我就认为是不是要自己调用fork()来创建子进程,于是我就写下面的函数

  int main(viod)
  {
  int fd;
  ......
   
  fd=fork();
  if(fd==0)
  {
  调用system()杀死父进程。
  while(1);
  }
  }

本来我没有加while(1),,因为我在看到杀死父进程后,自子进程也被杀死了,我觉得可能是子进程执行完了,退出了,所以我加一个死循环,子进程永远不会退出,但是结果,子进程仍然是被杀死了。
我看过说killall会杀死父进程和他的所有子进程,所以我特意用kill,但是为什么还是不行,高手指点阿。








------解决方案--------------------
你的system执行的命令是怎么样的?
我用你的第二种方案写了一个程序,如下,
int main(argn,argc,argv)
int argn;
char *argc[],*argv[];
{
pid_t pid,ppid;

ppid = getpid();
if ((pid = fork()) < 0){
return -1;
}
else if (pid == 0){
int i = 0;
char cmd[256];
sprintf(cmd,"kill -9 %d",ppid);
i = system(cmd);
while(1){
printf("kill result is %d\n",i);
}
return 0;
}
else {
while(1)
;
}
}
运行之后一直打印kill result is 0
------解决方案--------------------
试试以下的程序:
mymtom@freebsd:src/csdn/unix/kill$ cat child.sh
#!/bin/sh
sleep 30
kill $1
echo $?
sleep 10

mymtom@freebsd:src/csdn/unix/kill$ cat parent.c
#include <sys/types.h>
#include <unistd.h>

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
pid_t pid;
char s[64 + 1];

pid = getpid();
sprintf(s, "./child.sh %d", pid);
system(s);
for (;;)
{
sleep(60);
}
}

------解决方案--------------------
为什么“必须杀掉所有进程,才能启动控制台”?那就让init去启动控制台了。