无法使用fork退出子进程
我使用以下代码创建子进程,然后在一段时间后将其终止。
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不同。
system()
命令分离一个新的子进程,并暂停调用进程,直到该子进程退出。 当您终止子进程时, system()
创建的grand-child进程将继续运行。
而不是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); }
使用system
函数时,将创建另一个进程,其父进程是您的子进程。 您可以使用exec
而不是system
以便kill
可以发出正确的pid信号。
如果子进程应该只进行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); }