【问题标题】:Sending signal from child to parent从孩子发送信号给父母
【发布时间】:2017-11-04 04:14:38
【问题描述】:

这里我想在父母睡觉时向它发送 SIGINT 信号。我已经按照程序编写了它。在这个程序中,我不明白为什么来自父级的 SIGINT 信号处理程序根本没有执行? 这是代码:

#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
void sig_usr(int signo){
    if(signo == SIGINT)
    printf("Signal caught!");
    return;
}

int main(void){
    pid_t pid, ppid;
    ppid = getpid();
    printf("ppid = %d\n", ppid);
    if((pid = fork()) == 0){ 
        printf("killing parent...\n");
        kill(ppid, SIGINT);
        printf("After killing parent...\n");
    }
    else{
        sleep(5);
        printf("%d %d ",ppid, pid);
        if(signal(SIGINT,sig_usr) == SIG_ERR)
            printf("Signal processed ");
    }
    return 0;
}

输出: 输出只打印这么多内容。我认为 parent 根本没有执行。

【问题讨论】:

    标签: c signals


    【解决方案1】:

    你需要在SIGINT发送到父进程之前设置信号处理程序,否则,处理程序将不会被执行。此外,父进程在执行任何操作之前被杀死。解决此问题的简单方法是将睡眠调用移到父进程的代码之后,并为子进程添加延迟。

    #include<stdio.h>
    #include<signal.h>
    #include<unistd.h>
    #include<stdlib.h>
    void sig_usr(int signo){
        if(signo == SIGINT)
        printf("Signal caught!");
        return;
    }
    
    int main(void){
        pid_t pid, ppid;
        ppid = getpid();
        printf("ppid = %d\n", ppid);
        if((pid = fork()) == 0){ 
            sleep(1); // Wait for parent to finish setting up
            printf("killing parent...\n");
            kill(ppid, SIGINT);
            printf("After killing parent...\n");
        }
        else{
            printf("%d %d ",ppid, pid);
            if(signal(SIGINT,sig_usr) == SIG_ERR)
                printf("Signal processed ");
            sleep(5); // Wait to be killed
        }
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      当你发送 SIGINT 时,signal 还没有被调用。

      我认为您想在发送 SIGINT 之前设置信号处理程序:

      #include<stdio.h>
      #include<signal.h>
      #include<unistd.h>
      #include<stdlib.h>
      void sig_usr(int signo){
          if(signo == SIGINT)
          printf("Signal caught!");
          return;
      }
      
      int main(void){
          pid_t pid, ppid;
          ppid = getpid();
          printf("ppid = %d\n", ppid);
          if((pid = fork()) == 0){ 
              sleep(1);
              printf("killing parent...\n");
              kill(ppid, SIGINT);
              printf("After killing parent...\n");
          }
          else{
              printf("%d %d ",ppid, pid);
              if(signal(SIGINT,sig_usr) == SIG_ERR)
                  printf("Signal processed ");
              sleep(5);
          }
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        相关资源
        最近更新 更多