zoukankan      html  css  js  c++  java
  • 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
    %% ");
    }
  • 相关阅读:
    MySQL Partition--分区基础
    MySQL Replication--跳过复制错误
    MySQL--SHOW PROCESSLIST
    MySQL InnoDB Engine--缓冲器数据交换
    MySQL InnoDB Engine--数据预热
    MySQL Profiling--常用命令
    Linux--用户管理
    vi和vim快捷键的使用
    vi和vim
    xftp使用
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3495482.html
Copyright © 2011-2022 走看看