码迷,mamicode.com
首页 > 其他好文 > 详细

UNIX环境高级编程之-----信号signal

时间:2015-06-19 10:39:00      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:signal函数   unix信号   

参考书籍:unxi环境高级编程


信号函数:

<span style="font-family:Microsoft YaHei;font-size:18px;">typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
</span>

其原型为:

<span style="font-family:Microsoft YaHei;font-size:18px;">void (*signal(int signum,void (*handler)(int))) (int);</span>

我们一般都是用第一个,也就是通过typedef改写过的。

注意:signal函数我一般认为其是向内核注册当前进程收到信号的处理的方式。
signal(SIGINT,handler);

参数说明:

signum  :  指定信号
handler  :  SIG_IGN忽略该信号,SIG_DFL采用系统默认方式处理信号,自定义的信号处理函数指针。

理解实际的例子是学习的最好方式:
例子一:
通过异步方式,给子进程收尸

注意:子进程在终止时会给父进程发SIGCHLD,该信号的默认处理动作是忽略,父进程可以自定义SIGCHLD信号的处理函数,这样父进程只需要专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用wait清理子进程即可。


#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>


void child_exit_handler(int signum)
{
    if(signum == SIGCHLD)
    {
        printf("Child exit.\n");
        wait(NULL);
    }
}

int main()
{
    int pid;
    int i = 0;

    //想内核注册,处理 SIGCHLD信号的方式
    signal(SIGCHLD,child_exit_handler);

    if((pid = fork()) < 0)
    {
        perror("Fail to fork");
        exit(EXIT_FAILURE);

    }else if(pid == 0){
        
        for(i = 0;i < 5;i ++)
        {
            printf("child loop.\n");
            sleep(1);
        }
    
    }else{
        
        for(i = 0;i < 5;i ++)
        {
            printf("Father loop.\n");
            sleep(2);
        }

    }

    exit(EXIT_SUCCESS);
}

运行结果如下:
[uglychen@chenxun test]$ gcc test.c 
[uglychen@chenxun test]$ ls
a.out  test.c
[uglychen@chenxun test]$ ./a.out 
child loop.
Father loop.
child loop.
Father loop.
child loop.
child loop.
Father loop.
child loop.
Child exit.
Father loop.
Father loop.

[uglychen@chenxun test]$ 







UNIX环境高级编程之-----信号signal

标签:signal函数   unix信号   

原文地址:http://blog.csdn.net/chenxun_2010/article/details/46554759

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!