`
kongweile
  • 浏览: 507758 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

linux信号sig

 
阅读更多

Linux为实现信号处理提供了比较多的接口,看似纷杂,但理清信号的关系后还是很有条理的。主要分为以下四组,怎么发送一个信号,收到一个信号后做什么样的处理,主动等待一个信号的发生,对特定信号只记录是否发生供以后再处理;四组的API如下(不考虑多线程):
发送信号 kill, alarm, arise; 
安装信号 signal, sigaction;
等待信号 sigsuspend, sigwait,pause;
阻塞信号 sigfillset, sigemptyset, sigaddset, sigdelset, sigismember, sigprocmask;

 

发送信号, kill, alarm, arise
这是唯一一组由信号发送方调用的API,其中alarm, arise都是给自己进程产生信号,而kill是可以从一个进程发送一个信号到另一个进程,因为信号的接收方一般都不做权限检查,所以发送方要有权限给的接收方发送信号信号才能被发送,要不然我就可以写个非法程序,直接使用kill给进程1发送一个SIGKILL信号的话,你的系统基本也就OVER了。这个权限检查的指导原则按我的理解是,发送方的有效用户是否有权限给接收方的实际用户发送信号来决定。因为,当你运行一个seteuid程序,这个程序运行时的euid可能不再是ruid了,但是你仍然可以kill它。arise()的实现我猜就是用kill(getpid(), signo)来实现。另外系统内核检测到一些异常或是状态改变时也会给进程发送信号,如SIGINTR,SIGCHILD等等。

 

安装信号, signal, sigaction
这组API是决定收到一个信号号的处理方法。如果不显示的安装一个信号的处理方法,系统都有对应的默认处理方法,大多数都是直接终止程序本身. 在richard stevens的APUE中说signal的信号处理需要重新安装信号处理方法,但我在FC5下测试,不重新安装也是可以的,并且正在进行信号处理时,发送一个信号过去,该信号也不会丢失,只是暂时阻塞,等前面的信号处理完后再处理。当然当正在信号处理时发送多个信号过去,信号处理完后,可能传递一个信号过去,其它的信号会丢失。至于直接使用signal安装信号,等信号处理完后是否会重启被该信号中断的慢速系统调用,我没有测试,不得而知。 当然你可以使用sigaction来安装信号,并显示的指明restart标志,这样被该信号中断的系统调用就会自动重启。sigaction这个API更复杂,功能也更多灵活,可以随意定制,通过siginfo_t的结构,可以得到很多信号相关的信息。我猜现在的linux的signal都是用sigaction封装来实现的。跟sigaction相比,signal简单多了,没理由不用它,当然,你得保证signal的语义不会对你的程序造成冲突。

 

等待信号 pause, sigsuspend, sigwait
这组API都是等待信号的发生,可以根据程序的实际需求来选取。pause只要接收到信号就会返回,sigsuspend跟sigwait都是只等待某些特定的信号发生,但sigsuspend是把参数里的信号集给阻塞,而sigwait一般是先调用sigprocmask把所有的信号都阻塞,然后再等待sigwait参数里指定的信号。通常sigwait用在多线程程序里,主线程把所有信号都mask掉,然后不同的线程用sigwait来等待自己感兴趣的信号。

 

阻塞信号 sigfillset, sigemptyset, sigaddset, sigdelset, sigismember, sigprocmask
这一组API最多也最简单,前面五个API都是对信号集的操作,用它用得到一个你想要的信号集后就可以调用sigprocmaks的设置程序的信号掩码了。

 

另外, siglongjmp, sigsetjmp是安全的在信号处理程序里跑转的两个接口。

 

最后一些跟信号处理程序里的一些注意事项
1、因为信号会中断慢速的系统调用,所以当系统调用失败时,一定要检查失败原因,当被信号中断时做出重启系统调用的动作;
2、因为信号处理有异步性,所以任何在信号处理程序里调用了不具可重入性的函数都要小心了。这里的不具可重入性的函数据括了系统调用跟自己定义的函数。
3、在信号处理程序里任何可能导致对全局变理的修改也要小心了,一个经常被人忽视的就是在信号处理程序里调用了一个系统调用后可能导致errno的修改。

 

转:http://blog.csdn.net/guosha/article/details/2943615

分享到:
评论

相关推荐

    linux-sig.rar_linux sig 10

    linux 信号示例代码,程序包中包含多个不同版本,供参考学习!

    linux下基于C语言的信号编程实例

    本文实例讲述了linux下基于C语言的信号编程方法。分享给大家供大家参考。具体如下: #include #include #include #include #include void sig_handler(int sig_no, siginfo_t *info, void *ctext){ printf...

    linux信号量说明

    1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD18) SIGCONT ...

    linux 下实现sleep详解及简单实例

    linux 下实现sleep详解及简单实例 sleep: 普通版本 1、基本设计思路: ... 6> 切换到用户态执行sig_alrm函数,进⼊sig_alrm函数时SIGALRM信号被⾃动屏蔽,从sig_alrm函数返回SIGALRM信 号⾃动解除屏蔽。然后

    Linux进程间通信–使用信号

    一、什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?...信号的名称是在头文件signal.h中定义的,信号都以SIG开头,常用的信

    操作系统课程设计-信号通信与进程控制

    这是我的操作系统课程设计内容,多有参考,但也有不少原创内容,与大家分享。...“sig_pre.c”为源码文件,在red hat linux下编译通过得到可执行文件“sig_pre.exe”,另附报告书一份,书中人名均为化名。

    linux网络编程全套代码

    信号 signal: void fun(int sig); signal() 注册信号处理函数; IPC: 共享内存shm:最快!!!指针访问 消息队列msg:消息类型 信号灯集sem_arr:一堆灯, 编号从0开始, p,v Posix: 有名信号量: sem_open();...

    用多进程同步方法演示“生产者-消费者”问题

    1、设计目的:通过研究Linux的进程机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为1-20个整数。 3、设计要求: 生产者和消费者进程的数目不固定,可...

    Linux C 一站式学习

    Linux系统编程 28. 文件与I/O 1. 汇编程序的Hello world 2. C标准I/O库函数与Unbuffered I/O函数 3. open/close 4. read/write 5. lseek 6. fcntl 7. ioctl 8. mmap 29. 文件系统 1. 引言 2. ext2文件系统 2.1. 总体...

    Linux的core文件

     操作系统里面有很多信号(每个信号都有一个名字,且已SIG开头,用正整数表示,Linux系统一般在头文件中定义),分别代表了不同的含义,在Linux系统中,我们可以通过shell命令 kill -l 来查看系统有哪些信号。...

    操作系统课程设计

    4.kill(int pid,int sig)向一个进程或一个进程组发信号,可以用来送参数sig指定的信号给参数pid指定的进程。pid: pid>0 将信号传给进程号为pid的进程其它略signumber: 送给进程号为pid进程指定信号量5.alarm...

    Linux多线程环境下 关于进程线程终止函数总结

    向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响整个进程,也就是说,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出。 pthread_kill(threadid, ...

    Android Init进程对信号的处理流程详细介绍

    如果父进程没有做这种处理,且父进程初始化时也没有调用signal(SIGCHLD, SIG_IGN)来显示忽略对SIGCHLD的处理,这时子进程将一直保持当前的退出状态,不会完全退出。这样的子进程不能被调度,所做的只是在进程列表中...

    宋劲彬的嵌入式C语言一站式编程

    4.5. sig_atomic_t类型与volatile限定符 4.6. 竞态条件与sigsuspend函数 4.7. 关于SIGCHLD信号 34. 终端、作业控制与守护进程 1. 终端 1.1. 终端的基本概念 1.2. 终端登录过程 1.3. 网络登录过程 2. 作业控制 2.1. ...

    轻量级消息架构sigslot库

    原头文件在gcc编译中会出现问题,这是修改过去掉模板的资源,linux下随意使用。 sig---信号 slot---插槽 信号.connect(&插槽对象,&插槽类::插槽类成员函数)

    操作系统实验

    ②在程序中使用实例signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)进行通信操作,观察执行结果,并分析原因。 (4)软中断的捕获与重定义。首先定义一个服务函数function(),然后利用signal(sig,function)系统...

    synchsignal-开源

    概述:建立一种在多线程环境下以同步方式处理异步信号(Linux / Unix)的机制。 好处:1)信号处理程序将永远不需要信号安全。 2)多个信号处理程序可以注册相同的SIG NO。

    一个进程池的服务器程序

    signal(SIGCHLD, SIG_IGN); len200 = strlen(head200); len404 = strlen(head404); len503 = strlen(head503); daemon_init(); //转为后台程序,如需打印调试,把这行注释掉 if (write_pid() ) //避免同时...

    操作系统实验报告

    (2)任务二:在上面的程序中增加语句signal (SIGNAL, SIG-IGN)和signal (SIGQUIT, SIG-IGN),观察执行结果,并分析原因。 (3)任务三:进程的管道通信 编制一段程序,实现进程的管道通信。 使用系统调用pipe()建立...

Global site tag (gtag.js) - Google Analytics