1

ここで小さな単体テストを試みています。しかし、プログラムは期待どおりに動作しません。

    char *args[2];
    args[0] = (char*)"/usr/bin/firefox";
    args[1] = NULL;
    pid = fork();
    printf("forked and my pid is %d\n",pid);
    //check for errors
    if (pid<0){         
        printf("Error: invoking fork to start ss has failed, Exiting\n ");
        exit(1);
    }
    //the child process runs firefox
    if (pid==0){        
        if (execv(args[0],args)<0){
            perror("Error: running s with execvp has failed, Exiting\n");
        }
        printf("IVE BEEN KILLED\n");            
    }
    //dad is here
    printf("DAD IS GOING TO KILL U\n");
    if (pid>0){
        sleep(3);
        kill(get_pidof(string("firefox")),SIGUSR1);
    }

さて、私はプログラムが次のように実行されることを期待しています: 4.子プロセスはexecvの実行を終了し、「IVE BEEN KILLED」を出力します。これは起こりません。

私の目的は、execv が実行を継続した直後にいくつかのフラグを立てて、execv が実行したプログラムが終了したことを知ることです (printf が強制終了された場所)。数千行のコードがあり、必要でない限り他の方法を使用したくありません。

ありがとう

4

2 に答える 2

2

execv()現在のプロセスを新しいプロセスに置き換えます。firefoxが を介して起動されると、execv()基本printf("IVE BEEN KILLED\n")的にプロセスに存在しなくなり、実行されることはありません ( man execvを参照)。親プロセスは、子プロセスであるfirefoxがwait()を使用して終了するのを待つか、シグナル (例: ) を介して子プロセスの終了を警告することができますsignal(SIGCHLD, child_exit_handler)

于 2012-11-08T14:14:11.447 に答える
0

あなたは子供を殺しましたが、信号をキャッチできず、ただ死んでしまいました。少なくとも exec が返された場合はそうなるでしょうが、そうではありません。したがって、実行が失敗した場合にのみ印刷を実行します。

お子様が終了したかどうかを知りたい場合は、wait電話を使用してください。

また、子は終了しないため、親の pid のコードが実行されることに注意してください。これは興味深いことです。

于 2012-11-08T14:15:12.850 に答える