为C中的任何信号设置信号处理程序
我正在研究C信号,我遇到了一个练习的问题,这个练习需要编写一个程序,将它从进程接收到的任何信号发送回发送方进程。 我曾考虑过使用函数为C中的任何信号设置信号处理程序,c,posix,C,Posix,我正在研究C信号,我遇到了一个练习的问题,这个练习需要编写一个程序,将它从进程接收到的任何信号发送回发送方进程。 我曾考虑过使用函数signal()或函数sigaction(),但它们要求您指定信号,我需要它们来处理程序接收到的每个信号。 有没有办法不用为每个信号号调用sigaction()? 提前感谢您的回答您没有指定要使用的操作系统,但在POSIX系统上这很简单。我不能和窗户说话 你要的电话是 您需要阻止所有信号,然后使用sigwaitinfo同步处理任何接收到的信号。Sigwaitinfo
signal()
或函数sigaction()
,但它们要求您指定信号,我需要它们来处理程序接收到的每个信号。
有没有办法不用为每个信号号调用sigaction()
?
提前感谢您的回答您没有指定要使用的操作系统,但在POSIX系统上这很简单。我不能和窗户说话 你要的电话是 您需要阻止所有信号,然后使用
sigwaitinfo
同步处理任何接收到的信号。Sigwaitinfo的返回码是接收到的信号,当您传递一个非空的siginfo_t结构作为第二个参数时,您将获得从返回siginfo_t结构的信号处理程序中获得的相同信息,包括发送进程的pid。获取接收到的信号和pid,并使用kill
将信号发送回原始进程。在调用kill
之前,请确保您没有向自己发送信号,以免您陷入向自己发送和接收信号的循环
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#define errExit(msg) do {perror(msg); exit(EXIT_FAILURE);} while (0)
int main(int argc, char *argv[])
{
siginfo_t signalInfo;
sigset_t allSignals;
printf("echo pid = %d\n", getpid());
// block every signal but SIGKILL & SIGSTOP which can't be blocked
sigfillset(&allSignals);
if (sigprocmask(SIG_SETMASK, &allSignals, NULL) == -1)
errExit("sigprocmask");
while(1)
{
// accept signals until SIGTERM delivered
int sig = sigwaitinfo(&allSignals, &signalInfo);
if (sig == -1)
errExit("sigwaitinfo");
if (sig == SIGTERM)
{
printf("buh-bye\n");
exit(EXIT_SUCCESS);
}
printf("echo received signal %s (%d) from pid = %d\n", strsignal(sig), sig, signalInfo.si_pid);
/*** NOT doing this for testing because it will kill the sending shell
// echo signal back to sender but not to yourself
// which would be stupid and lead to an endless loop
if (signalInfo.si_pid != getpid())
kill(signalInfo.si_pid, sig);
***/
}
}
---2号航站楼---
只接受一个信号作为参数,但您可能只需要在所有信号中编写一个循环,并将它们的处理程序设置为相同。但是,请注意,您将无法处理
SIGKILL
。您是否也在编写另一个进程?如果是这样,则将其写入,使其仅发送一种类型的信号。
//current shell's pid
> echo $$
7646
//send signals after starting echo pgm in another terminal
> kill -SIGUSR1 7754
> kill -SIGUSR2 7754
> kill -SIGTERM 7754
> echosig
echo pid = 7754
echo received signal User defined signal 1 (10) from pid = 7646
echo received signal User defined signal 2 (12) from pid = 7646
buh-bye