0

我正在使用以下代码创建一个子进程,然后在一段时间后将其终止。

    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() 提供给我的父进程的 pidof 不同。

4

3 回答 3

4

system()命令派生出一个新的子进程,并暂停调用进程,直到该子进程退出。当您杀死您的子进程时,由创建的孙子进程system()继续运行。

而不是system(), 使用execl()which将当前进程替换为已执行的文件(在相同的 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);
}
于 2012-07-23T05:48:59.617 回答
2

当您使用该system功能时,会创建另一个进程,其父进程是您的子进程。您可以使用exec代替,system以便kill可以发出正确的 pid 信号。

于 2012-07-23T05:44:43.563 回答
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);
 }
于 2012-07-23T05:46:49.320 回答