信号闹钟操作 alarm(n) 闹钟,等s之后跳到闹钟结束进程
linux 代码:
让进程在1s后听到闹钟停止,打印count; 如果这1s内连续打印,因为有i/o count只到十几万,但是1s中自增时候没有打印,可以到几亿;
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <signal.h>
6
7 int count=0;
W> 8 void handler(int signo)
9 {
10 printf("count: %d\n",count);
11 exit(1);
12 }
13
14 int main()
15 {
16 signal(SIGALRM,handler);
17 alarm(1);
18 while(1)
19 {
20 count++;
21 }
22 }
raise 可以直接调用信号。
sigset_t set,oset;
#include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <signal.h>
7 void printPending(sigset_t* pending)
8 {
9 int i=1;
10 for(;i<=31;++i)
11 {
12 if(sigismember(pending,i))
13 {
14 printf("1 ");
15 }
16 else
17 {
18 printf("0 ");
19 }
20 }
21 printf("\n");
22 }
23
W> 24 void handler(int signo)
25 {
26 printf("恢复后,收到了2号信号\n");
27 }
28
29 int main()
30 {
31 signal(2,handler);
32 sigset_t set, oset;
33 sigemptyset(&set);
34 sigemptyset(&oset);
35
36 sigaddset(&set,2); //将二好信号加入到set
37
38 sigprocmask(SIG_SETMASK,&set,&oset); // 将加入了二好信号的set进行阻塞处理,oset用来接收原来未处理的set
39
40 sigset_t pending;
41 int count=0;
42 while(1)
43 {
44 sigemptyset(&pending); // 初始化pending(是否递交的证明)
45 sigpending(&pending);
46
47 printPending(&pending);
48 sleep(1);
49 count++;
50 if(count==10)
51 {
52 sigprocmask(SIG_SETMASK, &oset,NULL); //接收到2号信号之后(相当于让2号信号递交了),将pending置为初始状态。
53 printf("恢复信号屏蔽字\n");
54 }
55 }
56
57 }
结果如下显示:
二号信号传进来后,就是有1,pending阻塞住了,十秒后,我让他别阻塞了,直接接收到2号信号,pending变得没有1了。