0

如果我知道某个进程的 pid 不运行代码(比如 firefox),我该如何为其分配信号处理程序(比如 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

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


编辑

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

我需要我的程序运行另一个程序(比如 firefox),并知道 firefox 何时死亡或崩溃

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

于 2012-11-11T10:23:36.173 回答
0

正如Cnucitar在这里回答的那样,您只能从进程内部更改信号处理程序。

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

于 2012-11-11T10:55:09.603 回答