【问题标题】:Signal and kill C发出信号并杀死 C
【发布时间】:2016-08-30 13:49:41
【问题描述】:

我正在学习signal(),我有这两个文件:

server.c:

void handler_sigcont(){
  printf("SIGCONT server\n");
}

int main(){
  signal(SIGCONT,handler_sigcont);
  printf("%d\n",getpid());
  kill(getpid(),SIGSTOP);
  printf("server!\n");
}

client.c:

int main(int argc, char** argv){
  kill(atoi(argv[1]),SIGCONT);
  printf("client!\n");
}

首先我执行 server.c,这是输出:

6999

[7]+  Stopped                 ./sobusrv

然后我像这样执行client.c:

./client 6999

唤醒进程 6999。 输出如下:

client!
SIGCONT server
server!
[8]   Done                    ./sobusrv

但是,如果在 server.c 中,我在 kill() 之后更改了 signal(),如下所示:

void handler_sigcont(){
  printf("SIGCONT server\n");
}

int main(){

  printf("%d\n",getpid());
  kill(getpid(),SIGSTOP);
  printf("server!\n");
  signal(SIGCONT,handler_sigcont);
}

我得到这个输出:

client!
server!
[8]   Done                    ./sobusrv

我想知道为什么在signal() 写在kill() 之后会避免处理程序。

【问题讨论】:

  • 您已停止进程,因此它不会执行signal 调用。

标签: c unix signals kill


【解决方案1】:

如果在您的服务器中对signal() 的调用写在kill() 之后,这意味着在服务器接收到SIGCONT 之前不会安装信号处理程序。这是因为服务器中的kill()调用立即生效,挂起服务器进程。

在服务器收到SIGCONT 时,将使用默认处理程序,因为尚未安装其他处理程序。

【讨论】:

    【解决方案2】:

    不是避免,只是操作顺序不同。在您注册处理程序之前,您的服务器会收到一个 STOP 信号。当您向它发送 SIGCONT 时,它会继续,然后注册处理程序并退出,而不会收到另一个信号。在注册处理程序之前发生的信号不会执行处理程序。

    【讨论】:

      【解决方案3】:

      你可以像这样使用 raise(SIGCONT) 函数:

      void handler_sigcont(int sig){
        printf("SIGCONT server\n");
      }
      
      int main(){
        signal(SIGCONT,handler_sigcont);
        printf("%d\n",getpid());
        raise(SIGCONT);
        printf("server!\n");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-01
        • 2011-03-28
        • 2020-11-16
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2021-10-07
        • 2018-05-09
        相关资源
        最近更新 更多