linux c信号
时间:2010-08-19 来源:chinawanglun
3、在编写信号程序时,必须加上头文件<signal.h>。事实上,信号的定义的定义在另外的一个头文件中,但是该头文件又包含在<signal.h>中。 大家可以查看头文件/usr/include/signal.h 发现里边有一句include <bits/signum.h>,然后再查看头文件/usr/include/bits/signum.h 大家会发现信号的定义都在这里边.
二、信号产生的方式 1、用户按键,如用户按下了CTRL+C组合键 2、硬件异常,如除数为0,无效内存引用 3、进程调用kill函数将信号发送给一个进程或者进程组,限制条件是:接受信号进程和发送信号进程的所有者必须相同。或者发送信号的进程的所有者是超级用户 4、调用命令kill,实际上此命令是kill函数的接口 5、检测到某种软件条件已经发生。例如 SIGPIPE(管道的读进程已经终止后,另一个进程写此管道时产生) 当产生信号时,内核通常会在进程表中设置一个某种形式的标志,这就是所谓的向进程发送了一个信号。
三、进程的处理 1、捕捉信号,可以指定信号的处理函数,当捕捉的信号时自动执行此函数 2、忽略信号,除了SIGKILL和SIGSTOP,因为它们向超级用户提供了使进程终止或停止的方法。另外忽略了由某些硬件异常产生的信号(如无效内存引用),则进程运行的行为是不可预测的。 3、按照系统默认的方式处理,大部分信号的默认处理方式是终止进程,
四、信号的捕捉和处理 1、signal函数 -- 信号机制最简单的接口,用来设置进程在接受到信号时候的动作 在shell下输入man signal查看函数原型
#include <signal.h> |
signum为信号的编号 handler为信号处理函数 执行成功是返回信号处理函数指针,不成功时返回-1
举例如下:
#include <stdio.h>
return 0; }
|
这就是一个简单的关于信号的函数
2、sigaction函数
#include <signal.h> |
struct sigaction { |
具体的sigaction结构体的介绍,在使用man手册中会又详细的介绍。
举个简单例子:
#include <signal.h>
|
五、kill和raise函数
#include <sys/types.h> |
raise(int sif)等价于kill(getpid(),int sig)
kill的pid参数 pid > 0 将信号发送给pid进程 pid == 0 将信号发送给和发送信号进程属于同一进程组的所有进程(这些进程的组ID等于发送进程的必须相同) pid < 0 将信号发送给其进程组ID等于pid的的绝对值的进程。 pid == -1 将信号发送给发送进程有权限向它们发送信号的系统上的所有进程。
注意:上述的所有进程组都不包含某些特殊的系统进程。
六、alarm和pause函数
#include <unistd.h> |
alarm函数可以设置一个计时器。当计时器超时时,产生一个SIGALRM信号。如果不捕捉或者忽略这个信号,则其默认的动作就是终止调用alarm函数的进程 每个进程只能设置一个闹钟时钟,如果在调用alarm时,以前己为该进程设置了闹钟时钟,并且没有超时,则返回返回以前的闹钟的余留值作为本次alarm函数调用的返回值。以前的闹钟时钟被新值替换。若以前没有设置闹钟时钟,则调用alarm时,返回0
pause函数使进程挂起,直到捕捉到了一个信号。只有在执行了一个信号处理函数,并且从其返回时,pause才返回,在这种情况下,pause返回-1,并且将errno设置为EINTR。