通过pid分配信号处理程序

时间:2012-11-11 10:21:25

标签: c++ linux signals posix

如果我知道某个进程的pid没有运行代码(比如f​​irefox) 如何为它分配信号处理程序(比如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);
    }

2 个答案:

答案 0 :(得分:1)

您只能在过程中建立信号处理程序。换句话说,当获得SIGINT时,你不能让firefox调用你的信号处理程序。


修改

正如您所注意到的那样,确实在执行过程之后不会保留信号处理程序 - 该过程的图像被替换,因此没有意义。所以,就像我之前说过的那样:即使你控制了它的父母,也不能让firefox调用你的处理程序。

  

我需要我的程序来运行另一个程序(比如firefox),并且知道   当火狐死亡或坠毁时

在这种情况下,你想为SIGCHLD建立一个信号处理程序:你的进程将在孩子死亡时跳转到它。

答案 1 :(得分:0)

Cnucitar 回答here时,您只能从流程内部更改信号处理程序。

如果你想在firefox中创建一个信号处理程序,你可以修补它,也许是通过一个插件。但我相信这是个坏主意。