UNIX基础知识之信号

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/  

  信号(signal)是通知进程已发生某种情况的一种技术。例如,若某一进程执行除法操作,其除数为0,则将名为SIGFPE(浮点异常)的信号发送给该进程。进程如果处理信号有三种选择:

  (1)忽略该信号。有些信号表示硬件异常,例如,除以0或访问进程地址空间以外的单元等,因为这些异常产生的后果不确定,所以不推荐使用这种处理方式。

  (2)按系统默认方式处理。对于除以0的情况,系统默认方式是终止该进程。

  (3)提供一个函数,信号发生时则调用该函数,这被称为捕捉该信号。使用这种方式,我们只要提供自编的函数就将能知道什么时候产生了信号,并按所希望的方式处理它。

  很多情况会产生信号。终端键盘上有两种产生信号的方法,分别称为中断键(interrupt key,通常是Delete键或Ctrl+C)和退出键(quit key,通常是Ctrl+),它们被用于中断当前运行的进程。另一种产生信号的方法是调用名为kill的函数。在一个进程中调用此函数就可向另一个进程发送一个信号。当然这样做也有些限制:当向一个进程发送信号时,我们必须是该进程的所有这或是超级用户。

  程序清单1-8 从标准输入读命令并执行(改自程序清单1-5,加入了捕捉信号的功能):

[root@localhost unix_env_advance_prog]# cat prog1-8.c
#include "apue.h"
#include <sys/wait.h>

static void sig_int(int);  /* our signal-catching function */

int
main(void)
{
        char    buf[MAXLINE];   /* from apue.h */
        pid_t   pid;
        int     status;

        if(signal(SIGINT, sig_int) == SIG_ERR)
                err_sys("signal error");

        printf("%% "); /* print prompt (printf requires %% to print %) */
        while(fgets(buf, MAXLINE, stdin) != NULL)
        {
                if(buf[strlen(buf) - 1] == '
')
                        buf[strlen(buf) - 1] = 0; /* replace newline with null */

                if((pid = fork()) < 0)
                {
                        err_sys("fork error");
                }
                else if(pid == 0)  /* child */
                {
                        execlp(buf, buf, (char *)0);
                        err_ret("couldn't execute: %s", buf);
                        exit(127);
                }

                /* parent */
                if((pid = waitpid(pid, &status, 0)) < 0)
                        err_sys("waitpid error");
                printf("%% ");
        }
        exit(0);
}

void
sig_int(int signo)
{
        printf("interrupted
%% ");
}
原文地址:https://www.cnblogs.com/nufangrensheng/p/3495482.html