标签:
POSIX.1使用了六个信号来实现作业控制:
图10.31中的程序阐述了当一个进程处理作业控制的时候的正常的代码序列。该程序只是简单地复制其标准输入到其标准输出,但是在信号处理函数中给出的注释适用于管理屏幕的程序执行的典型动作。
“`#include “apue.h”
static void sig_tstp(int signo) /signal handler for SIGSTOP/
{
sigset_t mask;
/* … move cursor to lower left corner,reset tty mode … /
/ Unblock SIGSTOP,since it’s blocked while we’re handling it */
sigempty(&mask);
sigaddset(&mask, SIGSTOP);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
signal(SIGTSTP, SIG_DFL); /*reset disposition to default */
kill(getpid(), SIGTSTP); /*and send the signal to ourself */
/* we won‘t return from the kill until we‘re continued */
signal(SIGTSTP, sig_tstp);
/* ... reset tty mode, redraw screen ... */
}
int main(void)
{
int n;
char buf[BUFFSIZE];
/*
* only catch SIGTSTP if we‘re running with a jb-control shell.
*/
if(signal(SIGTSTP, SIG_IGN) == SIG_DFL)
{
signal(SIGTSTP, sig_tstp);
}
while((n = read(STDIN_FILENO, buf, BUFFSIZE) > 0)
{
if(write(STDOUT_FILENO, buf, n) != n)
{
err_sys("write error");
}
}
if(n < 0)
err_sys("read error");
exit(0);
}
“`
Figure 10.31 How to handle SIGTSTP
当图10.31中的程序开始运行的时候,仅仅在SIGTSTP信号的处理时SIG_DFL的时候才会去设置捕获信号SIGTSTP,其原因为:
标签:
原文地址:http://www.cnblogs.com/U201013687/p/5551415.html