请帮助我的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;
}
答案 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