【问题标题】:assign signal handler by pid通过 pid 分配信号处理程序
【发布时间】:2012-11-11 10:21:25
【问题描述】:

如果我知道某个进程的 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);
    }

【问题讨论】:

    标签: c++ linux signals posix


    【解决方案1】:

    您只能从进程内部建立信号处理程序。换句话说,你不能让 firefox 在收到 SIGINT 时调用你的信号处理程序。


    编辑

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

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

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

    【讨论】:

    • Ok..so 如果我 fork ,并使子进程 execv 另一个进程,我不能绑定子进程,因为如果我在 execv 之前做信号,信号处理程序将不会当 exec 结束时调用,因为它不再是子进程,并且我不能在 execv 之后调用信号处理程序(出于明显的原因)..我这样做吗?
    • @user1432779 我不确定你在问什么。你能改写一下吗?
    • 那真是太糟糕了..我几天来一直在尝试通过在 execv 调用之后立即出现的代码上放置一个标志来以某种方式知道 execv 调用何时结束......但是它如果我向它发送信号就不会到达那里......这很烦人
    • @user1432779 你在父级中寻找SIGCHLD :-) 我answered a similar question just the other day
    • 看看SIGCHLD是在什么情况下发给谁的,你会明白的... ;-)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多