我使用以下代码创建子进程,然后在一段时间后将其终止。
int pid;
if ((pid = fork()) < 0) {
printf("Error\n");
}
else if (pid == 0) {
printf("Child\n");
system("/usr/bin/./youtube-dl -o hello.mp4 http://www.youtube.com/watch?v=PDZcqBgCS74", NULL);
}
else {
printf("Father\n");
//system("ls");
printf("PId is %d",pid);
sleep(10);
kill(pid, SIGTERM);
}
问题是10秒后程序停止但youtube-dl进程没有。它仍然在继续。我的要求是我想要启动一个进程并在指定的时间后杀死它。我究竟做错了什么。我观察到我调用的pidof youtube-dl与fork()给出的父进程的pid不同。
答案 0 :(得分:4)
system()
命令会分离新的子进程,并暂停调用进程,直到该子进程退出。当您终止子进程时,system()
创建的祖子进程将继续运行。
使用system()
代替execl()
,而将替换当前进程与执行的文件(在相同的PID下):
else if (pid == 0) {
execl("/usr/bin/./youtube-dl", "/usr/bin/./youtube-dl", "-o", "hello.mp4", "http://www.youtube.com/watch?v=PDZcqBgCS74", NULL);
/* only reached if execl() fails */
perror("execl");
_exit(1);
}
答案 1 :(得分:2)
当您使用system
函数时,会创建另一个进程,其父进程是您的子进程。您可以使用exec
代替system
,以便kill
可以发出正确的pid信号。
答案 2 :(得分:2)
如果子进程只能进行youtube下载(之后不再进行),您可以简单地进行:
else if (pid == 0) {
/* chld process */
execl("/usr/bin/youtube-dl", "youtube-dl", "-o", "hello.mp4",
"http://www.youtube.com/watch?v=PDZcqBgCS74",
NULL);
perror ("youtube-dl exec failed");
_exit(126);
}