摘要:
经常混淆的两个信号就是SIGCLD以及SIGCHLD,信号SIGCLD源于System V,该信号的含义与源自BSD的信号SIGCHLD不一致。同时POSIX.1信号也称为SIGCHLD.源自BSD的信号SIGCHLD的语义比较正常,当该信号出现的时候,表示子进程的状态发生了变化,然后我们需要调用一个wait函数来查看究竟发生了什么。 System V对于SIGCLD的处理历史以来都与其他信号不... 阅读全文
摘要:
我们需要定义一些术语来继续信号的讨论,首先,信号是在造成信号的事件出现的时候由进程产生或者被发送到进程的,该事件可能是硬件错误(比如说除零错误),软件条件(比如说alarm设置的时间达到),或者是终端信号,或者是kill函数的调用,当信号产生的时候,内核通常在进程表中设置一些标志。 我们所说的”信号被发送到一个进程”是在进程准备执行信号处理函数的时候,在信号生成和被发送之间的时候,信号被称为pe... 阅读全文
摘要:
当一个信号捕获到并开始被进程处理的时候,进程正常执行的指令序列将被信号处理函数临时中断,进程立即转到信号处理函数中开始执行,如果信号处理函数返回(而不是调用exit或者是longjmp等),然后在进入信号处理函数之前进程正在执行的指令序列将会接着执行,但是在信号处理函数中,我们无法获知在信号被捕获的时候进程正在执行那一段代码,如果进程正在使用函数malloc在其堆上分配额外的内存的过程中会发生什么... 阅读全文
摘要:
早期UNIX系统的一个特点就是:当进程被阻塞再一个“slow”的系统调用中的时候如果捕获到一个信号,系统调用就会被中断,然后系统调用返回一个错误,其中errno被设置为EINTR.这可以实现使用一些事件的发生来唤醒被阻塞的系统调用。 为了支持这一特性,系统调用被分为两类:slow的系统调用,以及其他系统调用,所谓的slow系统调用是指可能永远阻塞的系统调用,包括如下系统调用: 读操作可能会永... 阅读全文
摘要:
在早期版本的UNIX系统中(比如说版本7),信号是不可靠的,意思是说信号可能丢失:一个信号出现,但是进程可能永远也不知道它,Aslo,a process had little conrol over a signal: a process could catch the signal or ignore it, 有时候,我们希望告知内核阻塞一个信号:不要忽略它,当信号出现的时候记住,然后在进程准备... 阅读全文
摘要:
UNIX系统的信号特性的最简单的接口就是signal函数: #include void (*signal(int signo, void(* func)(int)))(int); Returns:previous disposition of signal(see following)if OK,SIG_ERR on error. 函数signal由ISO C定义,并不涉及到多进程... 阅读全文
摘要:
信号是软件中断。许多重要的应用程序都需要处理信号,信号提供了一种异步事件处理的方法—举例来说,一个用户在终端上键入中断按键或者是pipeline中下一个程序提前终止。 信号在早期UNIX系统中就已经有提供了,但是系统中的信号模型并不可靠,信号可能丢失,当程序中执行一段关键区域的代码的时候,很难去关闭指定的信号。BSD4.3以及SVR3都对信号模型进行了修改,增加了称为可靠信号reliable s... 阅读全文
摘要:
首先,每一个信号都有一个名字,这些名字都是使用相同的三个字母SIG 开始的。举例来说,SIGABRT是当进程调用数abort的时候生成的终止信号。SIGALRM是当函数alaram设置的定时时间到的时候生成的alarm信号。版本7已经有了15中信号;SVR4以及4.4BSD有31种不同的信号,FreBSD 8.0支持32中不同的信号:Mac OS X10.6.8以及Linux3.2.0各支持31中... 阅读全文