开始对sa_flags有疑问,网上搜到都是这一个程序,就复制来说事:

代码:

1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <signal.h>
  5
  6 void show_handler (int sig)
  7 {
  8         printf ("i got signal %d/n",sig);
  9         int i;
 10         for (i = 0 ; i < 5; i++)
 11         {
 12                 printf ("i= %d/n",i);
 13                 sleep(1);
 14         }
 15 }
 16
 17 int main(void)
 18 {
 19         int i = 0;
 20         struct sigaction act , oldact;
 21         act.sa_handler = show_handler;
 22         sigaddset (&act.sa_mask, SIGQUIT);  /*这个信号用
    户终端键入ctrl+/时产生,送至前台所有进程,不仅终止前台进
    程组,还产生core文件,这一程序的作用是把SIGQUIT加入信号>    集,对CTRL+/的屏蔽*/
 23         act.sa_flags =SA_RESETHAND|SA_NODEFER ; /*if sig    nal got ,set to SIG_DEF*/
 24         //act.sa_flags = 0; //(3)
 25         //sigprocmask(SIG_BLOCK, &act.sa_mask,NULL);
 26         //this can be used for add sigset mask
 27         sigaction(SIGINT,&act,&oldact);
 28         while (1)
 29         {
 30                 sleep (1);
 31                 printf ("sleeping %d/n", i);
 32                 i++;
 33         }
 34 }

sigaction.sa_flags     控制内核对该信号的处理标记
    SA_NODEFER         一般情况下, 当信号处理函数运行时,内核将阻塞<该给定信号 -- SIGINT>。但是如果设置了SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号。 SA_NODEFER是这个标记的正式的POSIX名字(还有一个名字SA_NOMASK,为了软件的可移植性,一般不用这个名字)   
    SA_RESETHAND      当调用信号处理函数时,将信号的处理函数重置为缺省值。 SA_RESETHAND是这个标记的正式的POSIX名字(还有一个名字SA_ONESHOT,为了软件的可移植性,一般

上面是对sa_flags中常用的两个值的解释.]

疑问1:

act.sa_flags =SA_RESETHAND|SA_NODEFER ;

这一行程序中"|"按位或运算

那么sa_flags到底是什么样的值可以这样赋值,查看这个结构定义的根源:

/usr/include/bits/sigaction.h

/* Bits in `sa_flags'.  */
 54 #define SA_NOCLDSTOP  1          /* Don't send SIGCHLD when children stop.  */
 55 #define SA_NOCLDWAIT  2          /* Don't create zombie on child death.  */
 56 #define SA_SIGINFO    4          /* Invoke signal-catching function with
 57                                     three arguments instead of one.  */
 58 #if defined __USE_UNIX98 || defined __USE_MISC
 59 # define SA_ONSTACK   0x08000000 /* Use signal stack by using `sa_restorer'. */
 60 #endif
 61 #if defined __USE_UNIX98 || defined __USE_MISC || defined __USE_XOPEN2K8
 62 # define SA_RESTART   0x10000000 /* Restart syscall on signal return.  */
 63 # define SA_NODEFER   0x40000000 /* Don't automatically block the signal when
 64                                     its handler is being executed.  */
 65 # define SA_RESETHAND 0x80000000 /* Reset to SIG_DFL on entry to handler.  */
 66 #endif
 67 #ifdef __USE_MISC
 68 # define SA_INTERRUPT 0x20000000 /* Historical no-op.  */
可以看到sa_flags的值可以是上面的值在值的定义中看到每个宏都有一个数字相对应:这样这句程序就不难理解啦,也就是说它同时定义啦 SA_NODEFER和 SA_RESETHAND,都对信号处理函数作用。

看运行结果:

duxiao@ubuntu:~/apuestudy/10/3$ ./sig3
sleeping 0
sleeping 1
^Ci got signal 2
i= 0
i= 1
^C
这里先ctrl+c进入信号处理函数,然后ctrl+c终止程序,应为有sa_resethan是在信号处理函数中ctrl+c变为默认,这样就终止

sleeping 0
sleeping 1
^/退出
这个简单,就没进信号处理函数,

sleeping 0
^Ci got signal 2
i= 0
i= 1
^/i= 2
^/i= 3
i= 4
退出
 这个进入信号处理函数,键入ctrl+/,由于 sigaddset (&act.sa_mask, SIGQUIT)键所以对ctrl+/屏蔽,但回到主进程中依然会处理该信号,故退出,

好啦:现在把sa_flags改为sa_nodefer

i got signal 2
i= 0
i= 1
i= 2
i= 3
^Ci got signal 2
i= 0
i= 1
^Ci got signal 2
i= 0
i= 1
^/i= 2
i= 3
i= 4
i= 2
i= 3
i= 4
i= 4
退出
呵呵,sigaddset (&act.sa_mask, SIGQUIT);信号处理函数函数依然屏蔽,到主函数停止,

但是可以在信号处理函数中多次ctrl+c而不会推出,因为没有 SA_RESETHAND   所以不会恢复默认处理,还有个有趣的现象是i的输出顺序,这个没有信号队列的处理机制,小弟水平有限。

再看看只有 SA_RESETHAND

sleeping 0
^Ci got signal 2
i= 0
i= 1
^Ci= 2
i= 3
^/i= 4
这里有可能有人问, SA_RESETHAND 恢复默认,为什么没有停止,应为没有设置sa_nodefer

所以处理函数是对ctrl+c是阻塞的,只有到主函数中才有作用,

还有一个结果

sleeping 0
^Ci got signal 2
i= 0
i= 1
^/i= 2
^Ci= 3
i= 4
这个和上面的一样,但是在信号处理函数中,我把ctrl+c与ctrl+/的执行顺序便啦,如果ctrl+/作用,则在最后有“退出”两个子,可是这两个顺序都没有,可见不管是那个执行,都是ctrl+c作用结束啦程序,这个可能与信号与信号优先级有关??水平有限,待高手

小弟刚自学linux编程,以上只是根据试验结果自己理解,如有错误,恳请指教,

Q:915311043

今天又看程序发现以前有不完全的理解:

如果我们只用SA—NODEFER,这样会发现只要ctrl+c键入一次,就会运行一次handler(信号处理函数);

而你对信号作用的设置,只是对信号处理函数有作用,在主函数中ctrl+/仍然会终止程序,但是为什么键入ctrl+c不会终止,应为sigaction函数捕捉的是sigint(ctrl+c产生的信号),所以会再次产生handler

linux sigaction函数 sa_flags的值相关推荐

  1. linux下sigaction函数,Linux sigaction函数 sa_flags的值

    开始对sa_flags有疑问,网上搜到都是这一个程序,就复制来说事: 代码: 1 #include 2 #include 3 #include 4 #include 5 6 void show_han ...

  2. linux中signal函数返回值,signal函数、sigaction函数及信号集操作函数

    信号是与一定的进程相联系的.也就是说一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如一个进程可以忽略某些信号而只处理其他一些信号另外一个进程还可以选择如何处理信号.总之这些总与特定的进程相联 ...

  3. linux系统编程之信号(四):信号的捕捉与sigaction函数

    一.内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号.由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SI ...

  4. linux 中 sigaction 函数详解

    linux 中 sigaction 函数详解 一.函数原型 sigaction 函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作) int sigaction(int signum, ...

  5. Linux 进程学习(四)------ sigaction 函数

    转自:http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html 使用 sigaction 函数:  signal 函数的使用方法 ...

  6. linux中sigaction函数详解

    一.函数原型:sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作) int sigaction(int signum, const struct sigaction * ...

  7. linux下sigaction函数,sigaction函数解析

    sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作). 他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该 ...

  8. Linux信号signal介绍,sigaction结构体,signal()函数,sigaction()函数

    信号(signal)是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号).应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉.进程收到一 ...

  9. linux内核函数出错的返回值

    linux内核函数出错的返回值 1. 函数返回指针 2. 如何通过错误信息指针来返回错误信息 3. 出错代码返回指针在(-1000,0)区间 4. 错误的判断和错误原因的打印 4.1 错误的判断 4. ...

最新文章

  1. 零基础学python用什么书-零基础自学python3 好用的入门书籍推荐
  2. 利用 Java dump 进行 JVM 故障诊断
  3. 图像处理(十二)图像融合(1)Seamless cloning泊松克隆-Siggraph 2004
  4. 剑指 offer set 28 实现 Singleton 模式
  5. Spring的@Scope的几种取值
  6. Python 爬起数据时 'gbk' codec can't encode character '\xa0' 的问题
  7. 12伏的蓄电池有几个单格组成_蓄电池的结构和识别
  8. python场景应用方向_python的应用场景及学习方向
  9. 一个php请求的执行过程,PHP程序执行的过程原理
  10. python面向对象(特征,原则)01
  11. 若干tif文件转换成pdf
  12. phpdesigner8 php7.0,让getter和setter在phpDesigner8中运行
  13. 计算机在无法打开情况下怎么重置,电脑提示internet explorer无法打开internet站点怎么办...
  14. 2022数学建模美赛A题详细思路获取
  15. PAT | 算法笔记 | 简单模拟
  16. 在Anaconda中使用jupyter的保姆级安装教程
  17. 基于Webrtc的多人视频会议的简单实现
  18. 从表征到行动---意向性的自然主义进路(续一)
  19. 2876: 吃货排排坐
  20. Python问题:FileNotFoundError: [WinError 2] 系统找不到指定的文件。(已解决)

热门文章

  1. 云计算专业防火墙混合模式应用实验
  2. springboot毕设项目大学生租房系统s9331(java+VUE+Mybatis+Maven+Mysql)
  3. 6 个接私活的网站,你有技术就有钱!推荐给大家!
  4. 常见行内元素、块级元素、行内块元素
  5. 分享 :如何成为一个合格的数据架构师?
  6. 火鸟程序_火鸟网络管理
  7. 台灯AAA和AA有什么区别?国AA台灯有必要买吗
  8. android gta5 下载地址,gta5 for android
  9. 微信小程序获取当前位置并根据经纬度跳转地图导航
  10. python输出保留两位小数怎么表示_python中保留两位小数怎么表示