【问题标题】:Signals Behavior in C/C++ - LinuxC/C++ 中的信号行为 - Linux
【发布时间】:2021-06-20 15:19:23
【问题描述】:

对流程和信号完全陌生,我正在搞乱我编写的以下代码:

void childSignalHandler(int signalCode) {

    if (signalCode == SIGUSR1)
        cout << "Child here : Received ping, responding" << endl;
}

void parentSignalHandler(int signalCode) {

    if (signalCode == SIGINT)
        cout << "Parent here : Pinging Child" << endl;

    else if (signalCode == SIGUSR1)
        cout << "Parent here : Received response" << endl;

}


int main() {

    int pid = fork();

    /* Child process*/
    if (pid == 0) {

        if (signal(SIGUSR1, childSignalHandler) == SIG_ERR) {
            perror("Child SIGUSR1");
            exit(1);
        }
        // This did the trick!
        if (signal(SIGINT,SIG_IGN) == SIG_ERR){
            perror("Child SIGINT");
            exit(1);
        }

        pause();
        kill(getppid(), SIGUSR1);
    } else {

        if (signal(SIGINT, parentSignalHandler) == SIG_ERR) {
            perror("Parent SIGINT");
            exit(1);
        }
        if (signal(SIGUSR1, parentSignalHandler) == SIG_ERR) {
            perror("Parent SIGUSR1");
            exit(1);
        }
        raise(SIGINT); // Maybe change it to pause(); to use keyboard instead ?
        kill(pid, SIGUSR1);
        pause();
    }


    return 0;
} 

上面的代码运行良好,预期的行为是:

Parent here : Pinging Child
Child here : Received ping, responding
Parent here : Received response

但是,当我使用键盘 Ctrl + C 信号尝试相同的操作并将 raise(SIGINT); 更改为 pause(); 时,输出为:

^CParent here : Pinging Child
^CParent here : Pinging Child

我认为这会起作用的方式是:

  • 两个进程都将暂停
  • CTRL + C aka SIGINT 将被发送到父进程,该父进程将取消暂停
  • parentSignalHandler() 将处理 SIGINT 并打印相应的消息
  • 父进程将向子进程发送SIGUSR1,子进程将取消暂停,父进程本身将再次暂停
  • childSignalHandler() 将处理 SIGUSR1
  • 最后子进程会发送一个SIGUSR1给父进程,再一次由parentSignalHandler()处理

它似乎不像我想象的那样工作,任何见解都会非常有帮助。

编辑 -- 更新代码

【问题讨论】:

    标签: c unix signals


    【解决方案1】:

    raise(SIGINT) 仅将SIGINT 信号发送给调用进程——在这种情况下是父进程。另一方面,当您使用CTRL + C 发送SIGINT 信号时,您会将其发送到所有前台进程,即子进程也收到它并因此终止。所以没有子进程可以回复父进程的SIGUSR1信号。尝试忽略子进程中的信号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-13
      • 2020-11-27
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2014-04-29
      • 1970-01-01
      相关资源
      最近更新 更多