signal() - Unix,Linux系统调用
Tutorials Point


  Unix初学者指南
  Unix Shell编程
  高级Unix
  Unix有用参考
  Unix有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考文献     讨论论坛     关于TP  

signal() - Unix,Linux系统调用


previous next AddThis Social Bookmark Button

广告

名称

signal - ANSI C信号处理

概要

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

描述

signal()系统调用为编号为signum的信号安装一个新的信号处理程序。信号处理程序设置为sighandler,它可以是用户指定的函数,也可以是SIG_IGNSIG_DFL

当编号为signum的信号到达时,会发生以下情况。如果相应的处理程序设置为SIG_IGN,则忽略该信号。如果处理程序设置为SIG_DFL,则执行与该信号关联的默认操作(参见signal(7))。最后,如果处理程序设置为函数sighandler,则首先将处理程序重置为SIG_DFL或执行与实现相关的信号阻塞,然后调用sighandler,参数为signum

使用信号处理程序函数处理信号称为“捕获信号”。SIGKILLSIGSTOP信号无法捕获或忽略。

返回值

signal()函数返回信号处理程序的先前值,或在出错时返回SIG_ERR

可移植性

原始Unix signal()会将处理程序重置为SIG_DFL,System V(以及Linux内核和libc4,5)也是如此。另一方面,BSD不会重置处理程序,而是在调用处理程序期间阻止此信号的新实例发生。glibc2库遵循BSD行为。

如果在libc5系统上包含<bsd/signal.h>而不是<signal.h>,则signal()被重新定义为__bsd_signal,并且signal具有BSD语义。不推荐这样做。

如果在glibc2系统上定义特性测试宏,例如_XOPEN_SOURCE,或使用单独的sysv_signal函数,则会获得经典行为。不推荐这样做。

尝试使用定义和包含来更改此调用的语义不是一个好主意。最好完全避免使用signal(),而是使用sigaction(2)。

备注

此调用在多线程进程中的效果未指定。

例程handler必须非常小心,因为其他地方的处理在某个任意点被中断。POSIX有“安全函数”的概念。如果信号中断了一个不安全函数,并且handler调用了一个不安全函数,则行为未定义。安全函数在各种标准中被明确列出。POSIX.1-2003列表如下:

_Exit() _exit() abort() accept() access() aio_error() aio_return() aio_suspend() alarm() bind() cfgetispeed() cfgetospeed() cfsetispeed() cfsetospeed() chdir() chmod() chown() clock_gettime() close() connect() creat() dup() dup2() execle() execve() fchmod() fchown() fcntl() fdatasync() fork() fpathconf() fstat() fsync() ftruncate() getegid() geteuid() getgid() getgroups() getpeername() getpgrp() getpid() getppid() getsockname() getsockopt() getuid() kill() link() listen() lseek() lstat() mkdir() mkfifo() open() pathconf() pause() pipe() poll() posix_trace_event() pselect() raise() read() readlink() recv() recvfrom() recvmsg() rename() rmdir() select() sem_post() send() sendmsg() sendto() setgid() setpgid() setsid() setsockopt() setuid() shutdown() sigaction() sigaddset() sigdelset() sigemptyset() sigfillset() sigismember() signal() sigpause() sigpending() sigprocmask() sigqueue() sigset() sigsuspend() sleep() socket() socketpair() stat() symlink() sysconf() tcdrain() tcflow() tcflush() tcgetattr() tcgetpgrp() tcsendbreak() tcsetattr() tcsetpgrp() time() timer_getoverrun() timer_gettime() timer_settime() times() umask() uname() unlink() utime() wait() waitpid() write()。

根据POSIX,如果忽略了不是由kill(2)或raise(3)函数生成的SIGFPESIGILLSIGSEGV信号,则进程的行为未定义。整数除以零的结果未定义。在某些体系结构上,它会生成SIGFPE信号。(将最负整数除以-1也可能生成SIGFPE。)忽略此信号可能会导致无限循环。

有关将SIGCHLD设置为SIG_IGN时发生的情况的详细信息,请参见sigaction(2)。

sighandler_t的使用是GNU扩展。libc的各种版本预定义了此类型;libc4和libc5定义了SignalHandler,glibc定义了sig_t,并且当定义了_GNU_SOURCE时,还定义了sighandler_t

符合标准

C89, POSIX.1-2001。

参见



previous next Printer Friendly

广告


  

广告



广告