0

コードを実行しない特定のプロセス (firefox など) の pid がわかっている場合、それにシグナル ハンドラ (SIGINT など) を割り当てるにはどうすればよいですか?

私が今持っています :

    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 the gulp
    if (pid==0){
        printf("STARTING THE FIREFOX\n");           
                    //calling signal(somehandler,SIGINT); here will bind the child, which is replaced by the firefox new process,hence won't invoke the "somehandler"
        if (execv(args[0],args)<0){
            perror("Error: running s with execvp has failed, Exiting\n");
        }
                    //invoking signal(somehandler,SIGINT); will obviously not do anything
        printf("IVE BEEN KILLED\n");            
    }
    //dad is here
    printf("DAD IS GOING TO KILL\n");
    if (pid>0){
        sleep(6);
                    //how do I bind a handler to that signal????
        kill(get_pidof(string("firefox")),SIGINT);
    }
4

2 に答える 2

1

プロセス内からのみシグナル ハンドラを確立できます。別の言い方をすれば、Firefox が SIGINT を受け取ったときにシグナル ハンドラを呼び出させることはできません。


編集

お気づきのように、実際にはシグナル ハンドラーは exec の後に保持されません。プロセスのイメージが置き換えられるため、意味がありません。firefoxしたがって、前に述べたように、親を制御していても、ハンドラーを呼び出すことはできません。

別のプログラム (たとえば、Firefox) を実行し、Firefox がいつ停止またはクラッシュしたかを知るために、自分のプログラムが必要です。

その場合、 のシグナル ハンドラーを確立する必要がありSIGCHLDます。子プロセスが終了すると、プロセスはそこにジャンプします。

于 2012-11-11T10:23:36.173 に答える
0

Cnucitarがここで回答したように、プロセス内からのみシグナル ハンドラを変更できます。

Firefox 内でシグナル ハンドラーを作成したい場合は、おそらくプラグインを介してパッチを適用できます。しかし、それは悪い考えだと確信しています。

于 2012-11-11T10:55:09.603 に答える