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プロセスが停止しないことです。それはまだ続いています。私の要件は、プロセスを開始し、指定された時間が経過した後にそれを強制終了することです。私は正確に何を間違っているのですか。私が呼び出しているpidofyoutube-dlは、fork()から親プロセスに与えられたものとは異なることに気付きました。

4

3 に答える 3

4

このsystem()コマンドは、新しい子プロセスをフォークし、その子が終了するまで呼び出しプロセスを一時停止します。子プロセスを強制終了すると、によって作成された孫プロセスsystem()は実行を継続します。

の代わりに、現在のプロセスを(同じPIDの下で)実行されたファイルに置き換えるsystem()使用します。execl()

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の代わりにを使用して、が正しいpidを通知できるsystemようにすることができます。kill

于 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 に答える