注意 | 这里信号的产生、注册和注销等是指信号的内部实现机制,而不是调用信号的函数实现。因此,信号注册与否,与本节后面讲到的发送信号函数(如kill()等)以及信号安装函数(如signal()等)无关,只与信号值有关。 |
信 号 名 | 含 义 | 默 认 操 作 |
SIGHUP | 该信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一会话内的各个作业与控制终端不再关联 | 终止 |
SIGINT | 该信号在用户键入INTR字符(通常是Ctrl-C)时发出,终端驱动程序发送此信号并送到前台进程中的每一个进程 | 终止 |
SIGQUIT | 该信号和SIGINT类似,但由QUIT字符(通常是Ctrl-\)来控制 | 终止 |
SIGILL | 该信号在一个进程企图执行一条非法指令时(可执行文件本身出现错误,或者试图执行数据段、堆栈溢出时)发出 | 终止 |
SIGFPE | 该信号在发生致命的算术运算错误时发出。这里不仅包括浮点运算错误,还包括溢出及除数为0等其他所有的算术错误 | 终止 |
SIGKILL | 该信号用来立即结束程序的运行,并且不能被阻塞、处理或忽略 | 终止 |
SIGALRM | 该信号当一个定时器到时的时候发出 | 终止 |
SIGSTOP | 该信号用于暂停一个进程,且不能被阻塞、处理或忽略 | 暂停进程 |
SIGTSTP | 该信号用于交互停止进程,用户键入SUSP字符时(通常是Ctrl+Z)发出这个信号 | 停止进程 |
SIGCHLD | 子进程改变状态时,父进程会收到这个信号 | 忽略 |
SIGABORT | 进程异常终止时发出 | |
所需头文件 | #include <signal.h> #include <sys/types.h> | |
函数原型 | int kill(pid_t pid, int sig) | |
函数传入值 | pid: | 正数:要发送信号的进程号 |
0:信号被发送到所有和当前进程在同一个进程组的进程 | ||
-1:信号发给所有的进程表中的进程(除了进程号最大的进程外) | ||
<-1:信号发送给进程组号为-pid的每一个进程 | ||
sig:信号 | ||
函数返回值 | 成功:0 | |
出错:-1 |
所需头文件 | #include <signal.h> #include <sys/types.h> |
函数原型 | int raise(int sig) |
函数传入值 | sig:信号 |
函数返回值 | 成功:0 |
出错:-1 |
所需头文件 | #include <unistd.h> |
函数原型 | unsigned int alarm(unsigned int seconds) |
函数传入值 | seconds:指定秒数,系统经过seconds秒之后向该进程发送SIGALRM信号 |
函数返回值 | 成功:如果调用此alarm()前,进程中已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0 |
出错:-1 |
所需头文件 | #include <unistd.h> |
函数原型 | int pause(void) |
函数返回值 | -1,并且把error值设为EINTR |
想一想 | 用这种形式实现的sleep()功能有什么问题? |
注意 | 请读者注意信号的注册与信号的处理之间的区别,前者信号是主动方,而后者进程是主动方。信号的注册是在进程选择了特定信号处理之后特定信号的主动行为。 |
所需头文件 | #include <signal.h> | |
函数原型 | void (*signal(int signum, void (*handler)(int)))(int) | |
函数传入值 | signum:指定信号代码 | |
handler: | SIG_IGN:忽略该信号 | |
SIG_DFL:采用系统默认方式处理信号 | ||
自定义的信号处理函数指针 | ||
函数返回值 | 成功:以前的信号处理配置 | |
出错:-1 |
所需头文件 | #include <signal.h> |
函数原型 | int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) |
函数传入值 | signum:信号代码,可以为除SIGKILL及SIGSTOP外的任何一个特定有效的信号 |
act:指向结构sigaction的一个实例的指针,指定对特定信号的处理 | |
oldact:保存原来对相应信号的处理 | |
函数返回值 | 成功:0 |
出错:-1 |
选 项 | 含 义 |
SA_NODEFER \ SA_NOMASK | 当捕捉到此信号时,在执行其信号捕捉函数时,系统不会自动屏蔽此信号 |
SA_NOCLDSTOP | 进程忽略子进程产生的任何SIGSTOP、SIGTSTP、SIGTTIN和SIGTTOU信号 |
SA_RESTART | 令重启的系统调用起作用 |
SA_ONESHOT \ SA_RESETHAND | 自定义信号只执行一次,在执行完毕后恢复信号的系统默认动作 |
所需头文件 | #include <signal.h> |
函数原型 | int sigemptyset(sigset_t *set) |
int sigfillset(sigset_t *set) | |
int sigaddset(sigset_t *set, int signum) | |
int sigdelset(sigset_t *set, int signum) | |
int sigismember(sigset_t *set, int signum) | |
函数传入值 | set:信号集 |
signum:指定信号代码 | |
函数返回值 | 成功:0(sigismember成功返回1,失败返回0) |
出错:-1 |
所需头文件 | #include <signal.h> | |
函数原型 | int sigprocmask(int how, const sigset_t *set, sigset_t *oset) | |
函数传入值 | how:决定函数的操作方式 | SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中 |
SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合 | ||
SIG_SETMASK:将当前的信号集合设置为信号阻塞集合 | ||
set:指定信号集 | ||
oset:信号屏蔽字 | ||
函数返回值 | 成功:0 | |
出错:-1 |
所需头文件 | #include <signal.h> | |
函数原型 | int sigpending(sigset_t *set) | |
函数传入值 | set:要检测的信号集 | |
函数返回值 | 成功:0 | |
| 出错:-1 |
欢迎光临 DIY编程器网 (http://diybcq.com./) | Powered by Discuz! X3.2 |