为C中的任何信号设置信号处理程序

为C中的任何信号设置信号处理程序,c,posix,C,Posix,我正在研究C信号,我遇到了一个练习的问题,这个练习需要编写一个程序,将它从进程接收到的任何信号发送回发送方进程。 我曾考虑过使用函数signal()或函数sigaction(),但它们要求您指定信号,我需要它们来处理程序接收到的每个信号。 有没有办法不用为每个信号号调用sigaction()? 提前感谢您的回答您没有指定要使用的操作系统,但在POSIX系统上这很简单。我不能和窗户说话 你要的电话是 您需要阻止所有信号,然后使用sigwaitinfo同步处理任何接收到的信号。Sigwaitinfo

我正在研究C信号,我遇到了一个练习的问题,这个练习需要编写一个程序,将它从进程接收到的任何信号发送回发送方进程。 我曾考虑过使用函数
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