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] == '\n')

                        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\n%% ");

}

你可能感兴趣的:(unix)