linux下编程 ,关于信号sigaction中的sa_flags ,一些改变却不起作用

问题描述

linux下编程 ,关于信号sigaction中的sa_flags ,一些改变却不起作用
linux下编程 ,关于信号sigaction中的sa_flags ,一些改变却不起作用

本人最近在学习linux下的C语言编程,参考书上写程序却遇到了些问题。
在程序中

struct sigaction act;act.sa_handler = show_handler;act.sa_flags = SA_RESETHAND | SA_NODEFER ;sigaction(SIGINT&actNULL);

发现程序在处理SIGINT信号的show_handler函数期间,再次按下Ctrl+C,所产生的信号依旧被阻塞了
将第三句改为

act.sa_flags = SA_RESETHAND ;
情况正如预期,会在信号处理函数退出后重置缺省,并退出程序。

最后,我的问题是为什么SA_NODEFER设置了却没有任何反映?

解决方案

我不懂这个,不过我觉得按照你说的, | 操作的两个值应该打印出来,再把act.sa_flags的值打印出来,然后比较一下分析问题
因为是|操作,使用16进制输出看得清楚一些吧

时间: 2024-11-08 19:03:06

linux下编程 ,关于信号sigaction中的sa_flags ,一些改变却不起作用的相关文章

解决Linux下编程时的undefined reference to问题

最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' 关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助. 1.链接时缺失了相关目标文件(.o) 测试代码如下: 然后编译. gcc -c test.c gcc –c main.c 得到两个 .o 文件,一个是 mai

图片-linux下编程遇到的问题

问题描述 linux下编程遇到的问题 这个该怎么解决 解决方案 linux下串口编程问题Linux静态.共享和动态库之编程---看这个遇到运行问题应该有帮助Linux下编译MySQLdb遇到的问题 解决方案二: 你没有link对应的库文件.gcc的编译参数中要添加

linux系统编程之信号(二) 信号发送函数及不同精度的睡眠

一.kill, raise, killpg 函数 int kill(pid_t pid, int sig); int raise(int sig); int killpg(int pgrp, int sig); kill命令是调用kill函数实现的,kill函数可以给一个指定的进程或进程组发送指定的信号,其中kill 函数的pid 参数取值不同表示不同含义,具体可man 一下.raise函数可以给当前进程发送指定的信号(自己给自己发信号).killpg 函数可以给进程组发生信号.这三个函数都是成

Linux下rar及zip压缩包中批量替换某文件脚本

本需求是自己负责的一个生产系统上,有大量以zip和rar结尾的压缩文件散落在文件系统的各个文件夹,先在需要把压缩包里包含某一个特定文件(如tftpd32.exe或Tftpd32.exe,版本较旧),全都替换成比较新的tftpd32.exe版本.压缩文件总数约5000个,需要替换的数量约1500个. 因为是生产环境,不敢轻易乱动,所以脚本考虑的因素就非常多,不允许中间执行过程出现异常,所以找到文件后实际执行替换操作之前做好备份,并且将操作过程记录日志. 以下几点需要考虑: 分别处理zip和rar文

Linux下编程时的conflicting types for 'dev_t'问题

在Linux下编译程序有时会遇到这种问题,这貌似是一个Linux历史遗留问题: /usr/include/sys/types.h:62: error: conflicting types for 'dev_t' /usr/include/linux/types.h:13: error: previous declaration of 'dev_t' was here /usr/include/sys/types.h:67: error: conflicting types for 'gid_t'

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

一.内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号.由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SIGQUIT信号的处理函数sighandler. 2. 当前正在执行main函数,这时发生中断或异常切换到内核态. 3. 在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递达. 4. 内核决定返回用户态后不是恢复main函数的上下文继续执行,而是执行sighandler函数,s

linux系统编程之信号(五) 实时信号与sigqueue函数

一.sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用. 原型:int sigqueue(pid_t pid, int sig, const union sigval value); 参数: sigqueue的第一个参数是指定接收信号的进程id,第二个参数确定即将发送的信号,第三个参数是一个联合数据结构union sigval,指定了信号传递的参数,即通常所说的4字节值. 返回值:成功返回0,失败返回-1 typede

linux系统编程之信号(一) 信号概述

一.为了理解信号,先从我们最熟悉的场景说起: 1. 用户输入命令,在Shell下启动一个前台进程. 2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断. 3. 如果CPU当前正在执行这个进程的代码,则该进程的用户空间代码暂停执行,CPU从用户态切换到内核态处理硬件中断. 4. 终端驱动程序将Ctrl-C解释成一个SIGINT信号,记在该进程的PCB中(也可以说发送了一个SIGINT信号给该进程). 5. 当某个时刻要从内核返回到该进程的用户空间代码继续执行之前,首先处理PCB中记录的信号,

Linux下semop等待信号时出现Interrupted System Call错误(EINTR)解决方法_C 语言

错误现象:(semop函数调用,strerror(errno)输出结果)Interrupted system call平台:RedHat Linux LINUX文档关于EINTR的描述是这样子的:  While blocked in this system call, the process caught a signal.UNIX文档[IEEE Std 1003.1-2008]关于EINTR的描述是这样子的:  The semop() function was interrupted by a