信号基本概念:
https://blog.csdn.net/u010772289/article/details/88730256
关于信号,自己遇到的两个未解决的问题:
1.在信号处理函数里调用signal, 编译报错;去掉对signal函数的调用,编译通过。
#include <stdio.h>
#include <signal.h>
void sigQuitHandle(int signal);
int main(void)
{
sigset_t newSigSet;
sigset_t oldSigSet;
sigset_t pendingSigSet;
if (signal(SIGQUIT, sigQuitHandle) == SIG_ERR)
{
printf("sigquit install failed\n");
}
printf("install handle for SIGQUIT\n");
sigemptyset(&newSigSet);
sigaddset(&newSigSet, SIGQUIT);
if (sigprocmask(SIG_BLOCK, &newSigSet, &oldSigSet) < 0)
{
printf("SIG_BLOCK falied\n");
}
printf("block SIGQUIT\n");
sleep(6);
if (sigpending(&pendingSigSet) < 0)
{
printf("get pendingSigSet error\n");
}
if (sigismember(&pendingSigSet, SIGQUIT) < 0)
{
printf("sigquit not pending\n");
}
printf("SIGQUIT is pending\n");
if (sigprocmask(SIG_SETMASK, &oldSigSet, NULL) < 0)
{
printf("restore oldSigSet error\n");
}
printf("unblock SIGQUIT\n");
sleep(6);
return 0;
}
void sigQuitHandle(int signal)
{
printf("this is SIGQUIT process handle\n");
if (signal(SIGQUIT, sigQuitHandle) == SIG_ERR)
{
printf("sigquit install failed\n");
}
}
编译结果:
应该找到原因了: 信号处理函数中,signal函数被int signal遮盖了
2.无论是用signal或sigaction安装函数处理程序, 在未阻塞该信号的情况下,一旦信号被触发,会先中止进程,在打印信号处理程序里的信息。
#include <stdio.h>
#include <signal.h>
#include <pthread.h>
void SIGINTHandle(int signal);
int main(void)
{
struct sigaction sa_usr;
sa_usr.sa_flags = 0;
sa_usr.sa_handler = SIGINTHandle;
sigset_t newSigSet;
sigset_t oldSigSet;
sigset_t pendingSigSet;
if (sigaction(SIGINT, &sa_usr, NULL) == SIG_ERR)
{
printf("SIGINT install failed\n");
}
printf("install handle for SIGINT, pthread :%ld\n", pthread_self());
sigemptyset(&newSigSet);
sigaddset(&newSigSet, SIGINT);
if (sigprocmask(SIG_BLOCK, &newSigSet, &oldSigSet) < 0)
{
printf("SIG_BLOCK falied\n");
}
printf("block SIGINT\n");
sleep(6);
if (sigpending(&pendingSigSet) < 0)
{
printf("get pendingSigSet error\n");
}
if (sigismember(&pendingSigSet, SIGINT) < 0)
{
printf("SIGINT not pending\n");
}
printf("SIGINT is pending\n");
if (sigprocmask(SIG_SETMASK, &oldSigSet, NULL) < 0)
{
printf("restore oldSigSet error\n");
}
printf("unblock SIGINT\n");
sleep(6);
return 0;
}
void SIGINTHandle(int signal)
{
printf("this is SIGINT process handle\n");
}
执行结果: