在C程序中,我使用execvp()
来创建netcat侦听器。当程序终止时,我想杀死听众。例如:
int main(){
char *listener[] = {
"/bin/bash",
"-c",
"nc -l 1338 > text.tar",
NULL
};
execvp(listener[0], listener);
return 0;
}
我想在程序终止之前杀死这个netcat进程。但是,我正在查看此代码并认为可能程序将在netcat侦听器接收任何数据之前终止。也许我可以发出一个等待命令。
我想这归结为两个问题:
wait()
来调用netcat一段时间吗?答案 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
是“最强者”(不能被孩子捕捉)。