typedef __sigset_t sigset_t
typedef struct {
unsigned long int __val[ _SIGSET_NWORDS ];
}sigset_t;
# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
#include <signal.h>
#include <signal.h>
#include <stdio.h>
beyes@linux-beyes:~/C> ./sig_mask.exe
进入睡眠10秒
^Crecv SIGINT
睡眠醒来
SIGINT blocked
^C^C^C^C^C^C^C^C^CSIGINT is in pending queue
recv SIGINT
SIGINT unblocked
^\退出
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void my_err(const char *err_string, int line)
{
fprintf(stderr, "line:%d", line);
perror(err_string);
exit(1);
}
void hander_sigint(int signo)
{
printf("recv SIGRTMIN\\n");
}
int main()
{
sigset_t newmask, oldmask, pendmask; //定义信号集
/*安装信号处理函数*/
if (signal(SIGRTMIN, hander_sigint) == SIG_ERR) {
my_err("signal", __LINE__); /*__LINE__ 表示当前__LINE__ 所在的行数*/
}
printf("进入睡眠30秒\\n");
sleep(30);
printf("睡眠醒来\\n");
/*初始化信号集 newmask 并将 SIGINT 添加进去*/
sigemptyset(&newmask);
sigaddset(&newmask, SIGRTMIN);
/*屏蔽信号 SIGINT*/
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) {
my_err("sigprocmask", __LINE__);
} else {
printf("SIGRTMIN blocked\\n");
}
printf("设置了屏蔽实时信号 SIGRTMIN 后再睡眠10秒\\n");
sleep(10);
printf("醒来后要查看悬而未决的SIGRTMIN 信号情况\\n");
/*获取未决信号队列*/
if (sigpending(&pendmask) < 0) {
my_err("sigpending", __LINE__);
}
/*检查未决信号队列里是否有 SIGINT*/
switch (sigismember(&pendmask, SIGRTMIN)) {
case 0:
printf("SIGRTMIN is not in pending queue\\n");
case 1:
printf("SIGRTMIN is in pending queue\\n");
break;
case -1:
my_err("sigismember", __LINE__);
break;
default:
break;
}
/*解除对 SIGINT 的屏蔽*/
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) {
my_err("sigprocmask", __LINE__);
} else {
printf("SIGRTMIN unblocked\\n");
}
while(1)
;
return 0;
}
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
int main(int argc, char **argv)
{
int i;
int signum = SIGRTMIN;
pid_t pid;
if (argc == 2)
pid = atoi(argv[1]);
else return 0;
for(i=0; i<5; i++)
{
if (kill(pid, signum) < 0) {
perror("kill");
exit(1);
}
}
return 0;
}
beyes@linux-beyes:~/C> ./sig_mask2.exe
进入睡眠30秒
beyes@linux-beyes:~/C> ./my_kill.exe 10546
recv SIGRTMIN
recv SIGRTMIN
recv SIGRTMIN
recv SIGRTMIN
recv SIGRTMIN
睡眠醒来
SIGRTMIN blocked
设置了屏蔽实时信号 SIGRTMIN 后再睡眠10秒
beyes@linux-beyes:~/C> ./my_kill.exe 10546
醒来后要查看悬而未决的SIGRTMIN 信号情况
SIGRTMIN is in pending queue
recv SIGRTMIN
recv SIGRTMIN
recv SIGRTMIN
recv SIGRTMIN
recv SIGRTMIN
SIGRTMIN unblocked
^\\退出
typedef __sigset_t sigset_t
typedef struct {
unsigned long int __val[ _SIGSET_NWORDS ];
}sigset_t;
sigaddset(&newmask, SIGINT);
sigset_t newmask, oldmask;
sigemptyset(&newmask);
sigaddset(&newmask, SIGHUP);
for (i=0; i<_SIGSET_NWORDS; i++)
if (newmask.__val[i] != 0)
printf("%d:%d\\n", i,newmask.__val[i]);
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |