Linux中的SIGUSR1

时间:2018-09-30 08:48:13

标签: c

请帮助我的SIGUSR1没有收到,我不知道怎么了。我这样做是为了在Linux中练习。我退出使用ctrl + z的过程,然后键入kill -SIGUSR1,但未收到信号。

#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <signal.h>



void sig_handler(int signo){

    switch(signo)
    case SIGUSR1:
    printf("Hello\n");
    exit(0);

}
int main()
{
    pid_t pid;
    printf("PID: %i\n", getpid());



    while(1)
    {
    if(signal(SIGUSR1, sig_handler) == SIG_ERR)
    {
    printf("Error\n");    
    }
    sleep(2);
    }


return 0;

}

2 个答案:

答案 0 :(得分:1)

尝试这些步骤

  

第1步:在后台运行

bash# ./a.out &
[1] 4338 
# PID: 4338 
  

第2步:将SIGUSR1从bash发行到pid

   bash# kill -10 4338
   10 is for SIGUSR1

答案 1 :(得分:1)

按下ctrl+z键会使系统向正在运行的进程发送TSTP信号(SIGTSTP),并使该进程暂停其执行。

因此,当您在暂停进程中发送kill -SIGUSR1时,SIGUSR1信号将被阻止。

例如:

  

运行过程

$ ./a.out
PID*****: 10869
  

暂停流程

^Z  //Pressed ctrl+z
[1]+  Stopped                 ./a.out


$ ps
   PID TTY          TIME CMD
  7529 pts/0    00:00:00 bash
 10869 pts/0    00:00:00 a.out
 10870 pts/0    00:00:00 ps
  

发送SIGUSR

$ kill -SIGUSR1 10869
$
/*SIGUSR is blocked until process resumes*/
  

继续该过程。

$ fg
./a.out
Hello***
  

SIGUSR被发送到进程

$ ps
   PID TTY          TIME CMD
  7529 pts/0    00:00:00 bash
 10871 pts/0    00:00:00 ps

解决方案:

使用&在后​​台运行进程并发送SIGUSR1信号,如下所示。

$ ./a.out &
[1] 11400
$ PID*****: 11400



$kill -SIGUSR1 11400

$Hello***
$
[1]+  Done                    ./a.out