信号处理函数(2)-sigismember()】的更多相关文章

定义: int sigismember(const sigset_t *set,int signum);   表头文件: #include<signal.h>   说明: sigismember()用来测试参数signum 代表的信号是否已加入至参数set信号集里.如果信号集里已有该信号则返回1, 否则返回0.   返回值: 信号集已有该信号则返回1, 没有则返回0.如果有错误则返回-1.   相关函数: sigemptyset, sigfillset, sigaddset, sigdelse…
http://blog.163.com/he_junwei/blog/static/1979376462014021105242552/ http://www.ibm.com/developerworks/cn/linux/l-cn-signalsec/   Linux 多线程应用中编写安全的信号处理函数 在开发多线程应用时,开发人员一般都会考虑线程安全,会使用 pthread_mutex 去保护全局变量.如果应用中使用了信号,而且信号的产生不是因为程序运行出错,而是程序逻辑需要,譬如 SIGU…
错误情况及原因分析 前两天看APUE的时候,有个程序要自己制作一个sleep程序,结果在这个程序中就出现了在信号处理函数中调用longjmp函数的情况,结果就出现了错误,具体错误是啥呢,请参见下面这段程序: /* * 在信号处理函数中调用longjmp的错误情况 */ #include <errno.h> #include <setjmp.h> #include <signal.h> #include <string.h> #include <stdl…
转自:https://www.cnblogs.com/virusolf/p/4945642.html http://blog.163.com/he_junwei/blog/static/1979376462014021105242552/ http://www.ibm.com/developerworks/cn/linux/l-cn-signalsec/ Linux 多线程应用中编写安全的信号处理函数 在开发多线程应用时,开发人员一般都会考虑线程安全,会使用 pthread_mutex 去保护全…
#include <stdio.h> #include <sys/wait.h> void sig_chld(int signo) { pid_t pid; int stat; pid = wait(&stat); printf("child %d terminated\n", pid); return; } 警告:在信号处理函数中调用诸如printf这样的标准I/O函数是不合适的(为什么)…
由于在信号处理期间自动屏蔽了正在被处理的信号,而使用setjmp/longjmp跳出信号处理程序时又不会自动将 信号屏蔽码修改会原来的屏蔽码,从而引起该信号被永久屏蔽. 可以使用sigsetjmp/siglongjmp来解决这一问题. int sigsetjmp(sigjmp_buf env, int savesigs); void siglongjmp(sigjmp_buf env, int val); 如果savesigs非0,则sigsetjmp在env中保存进程的当前信号屏蔽字,在调用s…
信号处理函数可以正常返回,也可以调用其他函数返回到程序的主函数中,而不是从该处理程序返回. 正如ANSI C标准所说明的,一个信号处理程序可以返回或者调用abort.exit或longjmp(goto不支持跳出它所在的函数, 因此不能用来从信号处理程序返回到主函数中). int setjmp(jmp_buf env); int sigsetjmp(sigjmp_buf env, int savesigs); void longjmp(jmp_buf env, int val); void sig…
在写一个Tomcat应用,类需要被信号处理函数回调,可是在单独的程序中测试没用问题: void OnSingalHandler(int sig) { ... JNIEnv* env=NULL; if (g_VM->AttachCurrentThread((void**)&env, NULL) != JNI_OK) { printf("AttachCurrentThread failed!\n"); } jclass cls = env->FindClass(&quo…
http://www.groad.net/bbs/thread-8253-1-1.html 当你在命令行里工作时,经常会输入 Ctrl-C 这个组合键以停止程序的运行.SetConsoleCtrlHandler() 函数可以让一个或多个特定函数在接收到 Ctrl-C, Ctrl-break 这些与控制台有关的信号时得到执行. BOOL WINAPI SetConsoleCtrlHandler( _In_opt_  PHANDLER_ROUTINE HandlerRoutine, _In_    …
概览 因malloc是加锁的,上网了解的相关信息,额外了解到信号处理规范使用,mark 正文 在执行malloc的过程中,跳转到了信号处理函数中.而信号处理函数在调用某个系统api时,内部又调用了malloc. 看了glibc源码就会知道,malloc内部也是有锁.而且是非嵌套的,如果在上一次调用中拿到锁,又跳转到信号处理函数中再次malloc,自然就导致死锁了.而且即使没有死锁,也极有可能破坏malloc内部维护的一些全局信息,导致后面莫名其妙的崩溃;由此可见,对于信号处理函数"必须保证可重入…
信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据. 一.信号的来源 信号的来源可以有很多种试,按照产生条件的不同可以分为硬件和软件两种. 1.  硬件方式 当用户在终端上按下某键时,将产生信号.如按下组合键后将产生一个SIGINT信号. 硬件异常产生信号:除数据.无效的存储访问等.这些事件通常由硬件(如:CPU)检测到,并将其通知…
定义: int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact); 表头文件: #include<signal.h> 说明: sigaction()会依参数signum指定的信号编号来设置该信号的处理函数.参数signum可以指定SIGKILL和SIGSTOP以外的所有信号. 如参数结构sigaction定义如下 struct sigaction { void (*sa_handler) (i…
守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程.PHP也可以实现守护进程的功能. 1.基本概念 进程 每个进程都有一个父进程,子进程退出,父进程能得到子进程退出的状态. 进程组 每个进程都属于一个进程组,每个进程组都有一个进程组号,该号等于该进程组组长的PID 2.守护编程要点 1. 在后台运行.              为避免挂起控制终端将Daemon放入后台执行.方法是在进程中调用fork使父…
软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过系统调用kill发送软中断信号. 内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件. 注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据. kill -l  ##可以列举当前系统支持的信号 void (*signal(int sig, void (*func)(int)))(int)   ##singal 原型 看例子吧. #include<stdio.h> #include…
定义: unsigned int alarm(unsigned int seconds);   表头文件: #include<unistd.h>   说明: alarm()用来设置信号SIGALRM(14)在经过参数seconds指定的秒数后传送给目前的进程.如果参数seconds 为0, 则之前设置的闹钟会被取消, 并将剩下的时间返回.   返回值: 返回之前闹钟的剩余秒数, 如果之前未设闹钟则返回0.   相关函数: signal, sleep   示例: #include <uni…
#include <stdio.h> #include <sys/wait.h> void sig_chld(int signo) { pid_t pid; int stat; , &stat, WNOHANG)) > ) { printf("child %d terminated\n", pid); } return; } 注:选项WNOHANG告知waitpid在尚有未终止的子进程在运行时不要阻塞…
lienhua342014-11-05 sigaction 函数跟 signal 函数一样,用于设置信号处理函数.此函数是用于取代 UNIX 早期版本使用的 signal 函数.UNIX 早期版本的 signal 函数在捕获到一个信号之后,就会自动将该信号的处理动作恢复为默认处理动作.于是,如果我们希望注册的信号处理函数长期生效,则需要在信号处理程序中再次调用 signal 函数注册一次.这样的操作太麻烦,而且在信号处理函数中再次调用 signal 注册信号处理函数之前可能又会产生该信号,而这个…
Use Reentrant Functions for Safer Signal Handling 使用可重入函数进行更安全的信号处理 How and when to employ reentrancy to keep your code bug free 何时及如何利用可重入性避免代码缺陷 Dipak Jha (mailto:dipakjha@in.ibm.com?subject=Use reentrant functions for safer signal handling&cc=dipa…
信号的捕捉和处理 主要由signal和sigaction函数来完成.还有一个函数pause,它可用来响应任何信号,不过不做任何处理. 1.signal函数 typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 当指定的信号到达时,就会跳转到参数handler指定的函数执行.如果handler参数不是函数指针,那么必须是常数: SIG_IGN(忽略该信号)或SIG_DFL(…
1基本概念 中断 q  中断是系统对于异步事件的响应 q  中断信号 q  中断源 q  现场信息 q  中断处理程序 q  中断向量表 异步事件的响应:进程执行代码的过程中可以随时被打断,然后去执行异常处理程序 生活中的中断和计算机系统中的中断 1)  无中断生活场景 张三看书,厨房烧水 2)有中断的生活场景 张三看书,设置闹钟,厨房烧水. 闹钟发出中断信号,张三把书合好(第20页),去厨房把开水事情处理好,张三重新打开20页进行阅读. 3)计算机系统的中断场景 中断源发出中断信号,CPU判断…
1. 字符测试函数 函数 说明 isascii() 判断字符是否为ASCII码字符 2. 字符串操作 函数 说明 gcvt() 将浮点型数转换为字符串(四舍五入) index() 查找字符串并返回首次出现的位置 rindex() 查找字符串并返回最后一次出现的位置 strcasecmp() 判断字符串是否相等(忽略大小写) strcpy() 复制字符串 strdup() 复制字符串 strncasecmp() 比较字符串的前n个字符 3. 内存管理函数 函数 说明 getpagesize() 取…
首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Linux内核源码评头论足.以后的路还很长,我还是一步一个脚印的慢慢走着吧,Linux内核这座山,我才刚刚抵达山脚下. 好了,言归正传,我接着昨天写下去.如有错误还请各位看官指正,先此谢过. 上篇末尾,我们看到了这样的现象:send进程总共发送了500次SIGINT信号给rcv进程,但是实际过程中rcv只接受/处理…
转自:http://blog.csdn.net/sddzycnqjn/article/details/7285760 1. 信号概念 信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件).信号是硬件中断的软件模拟(软中断).每个信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD.SIGINT等,它们在系统头文件中定义,也可以通过在shell下键入kill –l查看信号列表,或者键入man 7 signal查看更详细的说明.信号的生成来自内核,让内核生成信号的请求来自3个地方…
第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. 2.void perror(const char *s) 该函数基于当前的errno值,在标准出错文件中输出一条出错消息,然后返回.声明在stdio.h文件中.它首先输出由s指向的字符串,然后是一个冒号,一个空格,接着是errno值对应的出错信息,最后是一个换行符. 第2章 UNIX标准化及实现…
信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定的进程相联系的.因此,首 先要建立其信号和进程的对应关系,这就是信号的安装登记. Linux 主要有两个函数实现信号的安装登记:signal和sigaction.其中signal在系统调用的基础上实现,是库函数.它只有两个参数,不支持信号 传递信息,主要是用于前32个非实时信号的安装:而sigact…
信号及其处理 信号处理是Unix和LInux系统为了响应某些状况而产生的事件,通常内核产生信号,进程收到信号后采取相应的动作. 例如当我们想强制结束一个程序的时候,我们通常会给它发送一个信号,然后该进程会捕捉到信号,紧接着该进程执行一定操作后最终被终止掉.不仅仅如此,通常下面几种情况 ①键盘事件(ctrl+c.ctrl+\) ②访问非法内存 ③硬件故障(如算术运算执行除以0操作) ④ 环境切换 都会有信号的产生,而对这些产生的信号是需要让进程来处理的,进而信号也被作为进程间通信或修改行为的一种方…
转自:http://www.cnblogs.com/taobataoma/archive/2007/08/30/875662.html alarm(设置信号传送闹钟) 相关函数 signal,sleep 表头文件 #include<unistd.h> 定义函数 unsigned int alarm(unsigned int seconds); 函数说明 alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程.如果参数seconds 为0,则之前设置的闹钟会…
函数函数sigaction 1. 函数sigaction原型: int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 分析: 参数 signum :要捕获的信号. 参数act:truct sigaction 结构体,后面具体讲解传入参数,新的处理方式 参数oldact:返回旧的 struct sigaction 结构体,传出参数,旧的处理方式 1.2 struct sigaction 结…
一.信号生命周期 从信号发送到信号处理函数的执行完毕 对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生:信号在进程中注册完毕:信号在进程中的注销完毕:信号处理函数执行完毕.相邻两个事件的时间间隔构成信号生命周期的一个阶段. 下面阐述四个事件的实际意义: 信号"诞生".信号的诞生指的是触发信号的事件发生(如检测到硬件异常.定时器超时以及调用信号发送函数kill()或sigqueue()等). 信号在目标…
一.信号及信号来源 信号本质 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达. 信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了.信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息. 信号来源 信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它…