如何杀死execvp进程

时间:2017-11-24 02:17:49

标签: c execvp

在C程序中,我使用execvp()来创建netcat侦听器。当程序终止时,我想杀死听众。例如:

int main(){
  char *listener[] = {
    "/bin/bash",
    "-c",
    "nc -l 1338 > text.tar",
     NULL
   };
   execvp(listener[0], listener);
   return 0;
}

我想在程序终止之前杀死这个netcat进程。但是,我正在查看此代码并认为可能程序将在netcat侦听器接收任何数据之前终止。也许我可以发出一个等待命令。

我想这归结为两个问题:

  • 如何杀死execvp过程?
  • 我需要wait()来调用netcat一段时间吗?

1 个答案:

答案 0 :(得分:3)

exec函数系列仅在出现错误时返回(即无法执行程序)。

所以你必须先fork()并跟踪pid。但是如果你想在主程序结束之前杀死子进程,它可能没有时间做任何事情。

这里我们在杀死它之前给予子进程10秒钟

#include <sys/types.h>
#include <signal.h>

#define TIME 10

int main(){
  char *listener[] = {
    "/bin/bash",
    "-c",
    "nc -l 1338 > text.tar",
     NULL
   };
   pid_t pid = fork();
   if ( ! pid) { // child
      execvp(listener[0], listener);
      // doesn't return (check error maybe)
   }
   printf("Waiting for %d seconds...\n", TIME);
   sleep(TIME);
   kill(pid, SIGTERM); 
   return 0;
}

使用SIGTERM信号(或使用SIGINT,如 Control-C ),如有必要,请检查man page以选择其他信号。 SIGKILL是“最强者”(​​不能被孩子捕捉)。