Sigaction
- SYNOPSIS
- #include <signal.h>
- int sigaction(int signum, const struct sigaction *act,
- struct sigaction *oldact);
功能:
sigaction函数用于改变进程接收到特定信号后的行为。
参数
第一个参数为信号的值,可以为除SIGKILL及SIGSTOP外的任何一个特定有效的信号(为这两个信号定义自己的处理函数,将导致信号安装错误)
第二个参数是指向结构sigaction的指针,在结构 sigaction的实例中,指定了对特定信号的处理,可以为空,进程会以缺省方式对信号处理
第三个参数oldact指向的对象用来保存原来对相应信号的处理,可指定oldact为NULL。
返回值
函数成功返回0,失败返回-1
sigaction结构体
第二个参数最为重要,其中包含了对指定信号的处理、信号所传递的信息、信号处理函数执行过程中应屏蔽掉哪些函数等等
-
- #define ERR_EXIT(m) \
- {\
- perror(m);\
- exit(EXIT_FAILURE);\
- }
-
- void onSignalAction(int signalNumber)
- {
- switch(signalNumber)
- {
- case SIGINT:
- cout << "SIGINT = " << signalNumber << endl;
- break;
- case SIGQUIT:
- cout << "SIGQUIT = " << signalNumber << endl;
- break;
- default:
- cout << "Other Signal ..." << endl;
- break;
- }
- }
-
- void onSa_SignalAction(int signalNum, siginfo_t *signalInfo, void *p)
- {
- cout << "signalNum = " << signalNum << endl;
- }
-
- int main()
- {
- struct sigaction act;
-
-
- act.sa_sigaction = onSa_SignalAction;
- if (sigaction(SIGINT,&act,NULL) == -1)
- ERR_EXIT("sigaction error");
-
- while (true)
- {
- pause();
- }
-
- return 0;
- }
siginfo_t结构:
- The siginfo_t parameter to sa_sigaction is a struct with the following elements
-
-
-
-
- int si_errno;
- int si_code;
- int si_trapno;
-
-
- pid_t si_pid;
- uid_t si_uid;
- int si_status;
- clock_t si_utime;
- clock_t si_stime;
- sigval_t si_value;
- int si_int;
- void *si_ptr;
- int si_overrun;
- int si_timerid;
- void *si_addr;
- long si_band;
-
- int si_fd;
- short si_addr_lsb;
-
- }
- */
-
- __sighandler_t mySignal(int sig, __sighandler_t handler)
- {
- struct sigaction act;
- struct sigaction oldact;
- act.sa_handler = handler;
- sigemptyset(&act.sa_mask);
- act.sa_flags = 0;
-
- if (sigaction(sig, &act, &oldact) < 0)
- return SIG_ERR;
-
- return oldact.sa_handler;
- }
-
- void handler(int sig)
- {
-
- printf("recv a sig=%d\n", sig);
- sleep(5);
- }
-
- int main(int argc, char *argv[])
- {
- struct sigaction act;
-
-
- act.sa_handler = handler;
-
- sigemptyset(&act.sa_mask);
- sigaddset(&act.sa_mask, SIGQUIT);
- act.sa_flags = 0;
-
-
- sigaction(SIGINT, &act, NULL);
- pause();
-
- return 0;
- }
sigqueue
- SYNOPSIS
- #include <signal.h>
- int sigqueue(pid_t pid, int sig, const union sigval value);
功能
sigqueue是新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。
和kill函数相比多了一个参数:const union sigval value,因此sigqueue()可以比kill()传递更多的信息,但sigqueue()只能向一个进程发送信号,而不能发送信号给一个进程组。
参数
参数1是指定接收信号的进程id,参数2确定即将发送的信号;
参数3是一个联合数据结构union sigval,指定了信号传递的参数,即通常所说的4字节值。
返回值
成功返回0,失败返回-1
sigval联合体
- typedef union sigval{
- int sival_int;
- void *sival_ptr;
- } sigval_t;
-
- inline void err_exit(const char *str)
- {
- perror(str);
- exit(EXIT_FAILURE);
- }
-
- void onSa_SignalAction(int signalNum, siginfo_t *signalInfo, void *p)
- {
- cout << "signalNum = " << signalNum << endl;
-
- int recValue = signalInfo -> si_int;
- cout << "recvValue = " << recValue << endl;
- }
-
- int main()
- {
- struct sigaction act;
-
- sigemptyset(&act.sa_mask);
- act.sa_flags = SA_SIGINFO;
- act.sa_sigaction = onSa_SignalAction;
- if (sigaction(SIGINT,&act,NULL) == -1)
- err_exit("sigaction error");
-
- pid_t pid = fork();
- if (pid == -1)
- err_exit("fork error");
- else if (pid == 0)
- {
-
-
-
-
-
-
-
-
- sigval_t signalValue;
- signalValue.sival_int = 256;
- sleep(2);
-
-
- sigqueue(getppid(),SIGINT,signalValue);
- }
-
- pause();
-
- return 0;
- }