摘要:
我们需要有一个能表示多个信号——信号集(signal set)的数据类型。POSIX.1定义了数据类型sigset_t以包含一个信号集,并且定义了下列五个处理信号集的函数。 #include int sigemptyset(sigset_t *set);int sigfillset(sigset_t *set);int sigaddset(sigset_t *set, int signo)... 阅读全文
摘要:
一、不可靠的信号在早期的UNIX版本中,信号是不可靠的。不可靠在这里指的是,信号可能会丢失:一个信号发生了,但进程却可能一直不知道这一点。早期版本中的一个问题是在进程每次接到信号对其进行处理时,随即将该信号动作复位为默认值(经测试,发现我现在用的Red Hat Linux 2.6.18也是这样处理的。)。在描述这些早期系统的编程书籍中,有一个经典实例,它与如何处理中断信号相关,其代码与下面所示的相似:int sig_int(); /* my signal handling function */...signal(SIGINT, sig_int); /... 阅读全文
摘要:
使用alarm函数可以设置一个计时器,在将来某个指定的时间,该计时器会超时。当计时器超时时,产生SIGALRM信号。如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程。 #include unsigned int alarm( unsigned int seconds );返回值:0或以前设置的闹钟时间的余留秒数其中,参数seconds的值是秒数,经过了指定的secon... 阅读全文
摘要:
kill函数将信号发送给进程或进程组。raise函数则允许进程向自身发送信号。 #include int kill(pid_t pid, int signo);int raise(int signo);两个函数返回值:若成功则返回0,若出错则返回-1调用 raise(signo);等价于调用 kill(getpid(), signo);kill的pid参数有4种不同的情况:pid > ... 阅读全文
摘要:
当引发信号的事件发生时,为进程产生一个信号(或向进程发送一个信号)。事件可以是硬件异常、软件条件、终端产生的信号或调用kill函数。 在产生了信号时,内核通常在进程表中设置一个某种形式的标志。当对信号采取了这种动作时,我们说向进程递送了一个信号。 在信号产生(generation)和递送(delivery)之间的时间间隔,称信号是未决的(pending)。 进程可以选用信号递送阻塞。如果为进... 阅读全文
摘要:
进程捕捉到信号并对其进行处理时,进程正在执行的指令序列就被信号处理程序临时中断,它首先执行该信号处理程序中的指令。如果从信号处理程序返回(例如信号处理程序没有调用exit或longjmp),则继续执行在捕捉到信号时进程正在执行的正常指令序列。但在信号处理程序中,不能判断捕捉到信号时进程在何处执行。如果程序正在执行malloc,在其堆中分配另外的存储空间,而此时由于捕捉到信号而插入执行该信号处理程... 阅读全文