2016-02-25
abort函数
void abort(void)
此函数将SIGABRT信号发送给调用进程。进程不应该忽略此信号。
ANSIC要求捕获到此信号而且相应信号处理程序返回,abort仍不会返回到其调用者。如果捕捉到此信号,这信号处理程序不能返回的唯一方法是它调用exit _exit longjmp siglongjmp POSIX1也说明abort覆盖了进程对此信号的阻塞和忽略。
让进程捕捉SIGABRT的意思是:在进程终止之前由其自行所需的清除操作。如果进程并不在信号处理程序中终止自己,POSIX说明当信号处理程序返回时abort终止该进程。
ANSIC对此函数的规格说明将这一问题留由实现决定,而不管输出流是否刷新以及不管临时文件是否删除。POSIX要求则更进一步,它要求如果abort调用终止进程则它应该有对所有打开的标准io流调用fclose的效果。但是如果调用abort并不终止进程,则它对打开的流也不应有影响。
system函数
POSIX要求system忽略SIGQUIT和SIGINT阻塞SIGCHLD。
system的返回值
system的返回值是shell的终止状态,它不总是执行命令字符串进程的终止状态。当且仅当shell本身异常终止时,system的返回值才报告一个异常终止。
sleep函数
unsigned int sleep(unsigned int seconds)
此函数使调用进程被挂起直到:
- 已经过了seconds所指定的墙上时钟时间
- 该进程捕捉到一个信号并且从信号处理程序返回
如同alarm信号一样,由于某些系统活动,实际返回时间会比所要求的迟一些。
超时返回值是0 由于捕捉到信号sleep提早返回时返回值是未睡眠足的秒数
sleep可以用alarm函数实现,但这并不是必须的。如果使用alarm,则这两个函数之间是可以有交互作用。POSIX标准对这些交互作用并未做任何说明。
作业控制信号
- SIGCHLD子进程已经停止或者终止
- SIGCONT 如果进程已经停止,则使其继续运行
- SIGSTOP 停止信号
- SIGSTP 交互停止信号
- SIGTTIN 后台进程组的成员读控制终端
- SIGTTOU 后台进程组的成员写控制终端
大多数应用程序并不处理这些信号,交互式shell通常处理这些信号的所有工作。当键入挂起字符(通常是Ctrl-Z)时,SIGTSTP被送至后台进程组的左右进程。当通知shell在前台或后台恢复一个作业时,shell向作业中的左右进程发送SIGCONT信号。与之类似的有如果向一个进程递送了SIGTTIN 或者 SIGTTOU 信号,则根据系统默认,此进程停止,作业控制shell了解到这一点后会通知我们。
一个例外是管理终端的进程,例如Vi 编辑程序。当用户要挂起它时,它需要能了解到这一点,这样就能将终端状态恢复到Vi 启动时的情况。另外,当在前台恢复它时,它需要将终端状态设置回所希望的状态,并需要重新绘制终端屏幕。