摘要: 在8.13节中,我们展示了一个system函数的实现,在哪一个版本中,我们并没有对信号做任何处理。POSIX.1要求system函数需要忽略SIGINT以及SIGQUIT信号,并且阻塞信号SIGCHLD.在展示一个正确处理这些信号的函数实现之前,让我们一起看一下为什么需要担心信号的处理。 Example 图10.26中显示的例子使用了8.13中的system函数调用了函数vi(1)编辑器.... 阅读全文
posted @ 2016-05-28 12:17 U201013687 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 我们早些时候提到函数abort能够造成程序的非正常终止。 #include void abort(void); This function never returns. 该函数会发送一个信号SIGABRT到调用进程。(进程不应该忽略这一信号),ISO C指出调用函数abort将会通过调用函数raise(SIGABRT)向主机环境发送一个不成功的终止通知。(ISO C states t... 阅读全文
posted @ 2016-05-26 07:29 U201013687 阅读(370) 评论(0) 推荐(0) 编辑
摘要: 我们已经学习了如何修改进程的信号掩码,实现指定信号的阻塞与接触阻塞。我们可以使用这一技术来保护临界区域的代码(当在这一段区域内执行代码的时候哦,我们不希望被信号中断),但是如果我们想要接触一个信号的阻塞,然后进入暂停状态,等待之前阻塞的信号的出现呢?假设指定的信号是SIGINT,可能会采用如下的方式来实现,但是确实错误的: sigset_t newmask,oldmask;sigem... 阅读全文
posted @ 2016-05-24 22:55 U201013687 阅读(424) 评论(0) 推荐(0) 编辑
摘要: 在7.10节中,我们讲述了setjmp以及longjmp函数,这两个函数用于远程跳转。其中longjmp函数进场在信号处理函数中被调用,用于返回到进程的主循环中去,而不是从信号处理函数中返回。 但是使用函数longjmp有一个问题,当一个信号被捕获的时候,信号处理函数被执行,当前信号将被自动增加到进程的信号掩码中去。这样做的目的是为了防止后续的信号中断当前信号处理函数的执行,如果我们调用lo... 阅读全文
posted @ 2016-05-22 23:36 U201013687 阅读(607) 评论(0) 推荐(0) 编辑
摘要: 函数sigaction允许我们获取或者是修改(或者获取并修改)与特定信号相关联的处理函数,该函数替代了早期的UNIX系统发布版中的函数signal,实际上,在本节末尾,我们将会使用sigaction来实现一个signal函数。 #include int sigaction(int signo, const struct sigaction *restrict act, struct siga... 阅读全文
posted @ 2016-05-22 23:35 U201013687 阅读(447) 评论(0) 推荐(0) 编辑
摘要: 函数sigpending被阻塞发送并且当前被调用该函数的进程挂起的信号,这个信号集通过参数set返回. #include int sigpending(sigset_t *set); Returns:0 if OK,-1 on error. Example #include "apue.h"static void sig_quit(int);int main(void){ ... 阅读全文
posted @ 2016-05-22 23:34 U201013687 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 在10.8节中我们提到进程的掩码是一个当前阻塞信号发送到进程的信号集合。一个进程可以查看其信号掩码,改变其信号掩码,或者同时执行这两个操作,通过调用函数sigprocmask来实现上述要求. #include int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset); return:0... 阅读全文
posted @ 2016-05-22 23:34 U201013687 阅读(388) 评论(0) 推荐(0) 编辑
摘要: 我们需要使用一种数据类型来存储多个信号,这种类型称为信号集,我们将在函数sigprocmask等函数中使用这些数据结构(下一节中),用于告知内核不要允许集合中的信号出现,正如我们早些时候提到的,不同信号的数量可能会超过一个整形变量的Bit数量,所以通常来说,我们不能使用整形变量中的每一个Bit来存储每一个信号。POSIX.1定义了数据结构sigset_t用存储信号集,并且允许如下五个函数对其进... 阅读全文
posted @ 2016-05-22 23:33 U201013687 阅读(145) 评论(0) 推荐(0) 编辑
摘要: alarm函数pause函数ExampleExampleExampleExample alarm函数 alarm函数允许我们设置一个在未来的某一时刻终止的定时器,当定时器终止的时候,SIGALRM信号就被发出,如果我们忽略或者不捕获这一信号的话,该信号的默认行为是终止进程. #include unsigned int alarm(unsigned int seconds); Ret... 阅读全文
posted @ 2016-05-22 23:33 U201013687 阅读(787) 评论(0) 推荐(0) 编辑
摘要: kill函数用于发送信号给一个进程或者是一个进程组,函数raise允许进程发送一个信号给自身。 raise函数最开始定义与ISO C中,POSIX.1为了与兼容ISO C标准,于是包含了函数raise,但是POSIX.1将函数raise的特性扩展到了线程处理(我们将在12.8中讨论线程是如何与信号发生交互的),因为ISO C并不处理多进程,它并不能定义向kill这样的函数,因为kill函数... 阅读全文
posted @ 2016-05-22 23:32 U201013687 阅读(451) 评论(0) 推荐(0) 编辑