精华内容
参与话题
问答
  • signal()函数理解 在 这个头文件中。 signal(参数1,参数2); 参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。 参数2:我们处理的方式(是...

    signal()函数理解

    <signal.h> 这个头文件中。

    signal(参数1,参数2);

    参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(64)。其实这些信号时系统定义的宏。

    参数2:我们处理的方式(是系统默认还是忽略还是捕获)。

    一般有3中方式进行操作。

    1eg: signal(SIGINT ,SIG_ING );

    //SIG_ING 代表忽略SIGINT信号SIGINT信号代表由InterruptKey产生,通常是CTRL +C 或者是DELETE 。发送给所有ForeGround Group的进程。

    下面我们写个死循环:


    这时我们保存执行。

    按下CTRL _C程序没有反应。这就对了

    如果我们想结束该程序可以按下CTRL +\来结束

    其实当我们按下CTRL +\组合键时,是产生了SIGQUIT信号

    2eg: signal(SIGINT ,SIG_DFL );

    //SIGINT信号代表由InterruptKey产生,通常是CTRL +C或者是DELETE。发送给所有ForeGroundGroup的进程。 SIG_DFL代表执行系统默认操作,其实对于大多数信号的系统默认动作时终止该进程。这与不写此处理函数是一样的。

    我们将上面的程序改成


    这时就可以按下CTRL +C 来终止该进程了。把signal(SIGINT,SIG_DFL);这句去掉,效果是一样的。

    (3) void ( *signal( int sig, void (* handler)( int )))( int );
    int (*p)();
    这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数.
    int (*fun())();
    这个式子与上面式子的区别在于用fun()代替了p,而fun()是一个函数,所以说就可以看成是fun()这个函数执行之后,它的返回值是一个函数指针,这个函数指针(其实就是上面的p)所指向的函数是一个不带任何参数,并且返回值为int的一个函数.

    void (*signal(int signo, void (*handler)(int)))(int);就可以看成是signal()函数(它自己是带两个参数,一个为整型,一个为函数指针的函数),而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带一个整型参数,并且返回值为void的一个函数.

    在写信号处理函数时对于信号处理的函数也是void sig_fun(int signo);这种类型,恰好与上面signal()函数所返回的函数指针所指向的函数是一样的.void ( *signal() )( int );

    signal是一个函数, 它返回一个函数指针, 后者所指向的函数接受一个整型参数 且没有返回值, 仔细看, 是不是siganal( int signo, void (*handler)(int) )的第2个参数了,对了,其实他所返回的就是 signal的第2个信号处理函数,指向信号处理函数,就可以执行函数了( signal内部时, signal把信号做为参数传递给handler信号处理函数,接着 signal函数返回指针, 并且又指向信号处理函数, 就开始执行它)

    那么,signal函数的参数又是如何呢?signal函数接受两个参数:一个整型的信号编号,以及一个指向用户定义的信号处理函数的指针。我们此前已经定义了指向用户定义的信号处理函数的指针sfp:

    void (*sfp)(int);

    sfp 的类型可以通过将上面的声明中的sfp去掉而得到,即void (*)(int)。此外,signal函数的返回值是一个指向调用前的用户定义信号处理函数的指针,这个指针的类型与sfp指针类型一致。因此,我们可以如下声明signal函数:

    void (*signal(int, void(*)(int)))(int);

    同样地,使用typedef可以简化上面的函数声明:

    typedef void (*HANDLER)(int);
    HANDLER signal(int, HANDLER);

    Ok;看个例子:


    此程序是对当我们按下CTRL +C键时,会执行我们定义的信号处理函数。

    每当我们按下CTRL +C键时会打印该信号的number.可以看出该信号的num2

    要想退出可以按下CTRL +\ 打印结果为最后一行。

    一些常用的Signal 如下:

    注:下面是从百度文库中找的(*^__^*) 嘻嘻……

    Signal Description
    SIGABRT 由调用abort函数产生,进程非正常退出
    SIGALRM 用alarm函数设置的timer超时或setitimer函数设置的interval timer超时
    SIGBUS 某种特定的硬件异常,通常由内存访问引起
    SIGCANCEL 由Solaris Thread Library内部使用,通常不会使用
    SIGCHLD 进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略
    SIGCONT 当被stop的进程恢复运行的时候,自动发送
    SIGEMT 和实现相关的硬件异常
    SIGFPE 数学相关的异常,如被0除,浮点溢出,等等
    SIGFREEZE Solaris专用,Hiberate或者Suspended时候发送
    SIGHUP 发送给具有Terminal的Controlling Process,当terminal被disconnect时候发送
    SIGILL 非法指令异常
    SIGINFO BSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程
    SIGINT 由Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程
    SIGIO 异步IO事件
    SIGIOT 实现相关的硬件异常,一般对应SIGABRT
    SIGKILL 无法处理和忽略。中止某个进程
    SIGLWP 由Solaris Thread Libray内部使用
    SIGPIPE 在reader中止之后写Pipe的时候发送
    SIGPOLL 当某个事件发送给Pollable Device的时候发送
    SIGPROF Setitimer指定的Profiling Interval Timer所产生
    SIGPWR 和系统相关。和UPS相关。
    SIGQUIT 输入Quit Key的时候(CTRL+\)发送给所有Foreground Group的进程
    SIGSEGV 非法内存访问
    SIGSTKFLT Linux专用,数学协处理器的栈异常
    SIGSTOP 中止进程。无法处理和忽略。
    SIGSYS 非法系统调用
    SIGTERM 请求中止进程,kill命令缺省发送
    SIGTHAW Solaris专用,从Suspend恢复时候发送
    SIGTRAP 实现相关的硬件异常。一般是调试异常
    SIGTSTP Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程
    SIGTTIN 当Background Group的进程尝试读取Terminal的时候发送
    SIGTTOU 当Background Group的进程尝试写Terminal的时候发送
    SIGURG 当out-of-band data接收的时候可能发送
    SIGUSR1 用户自定义signal 1
    SIGUSR2 用户自定义signal 2
    SIGVTALRM setitimer函数设置的Virtual Interval Timer超时的时候
    SIGWAITING Solaris Thread Library内部实现专用
    SIGWINCH 当Terminal的窗口大小改变的时候,发送给Foreground Group的所有进程
    SIGXCPU 当CPU时间限制超时的时候
    SIGXFSZ 进程超过文件大小限制
    SIGXRES Solaris专用,进程超过资源限制的时候发送
    展开全文
  • signal函数

    2011-05-14 22:43:00
    signal函数声明如下:void (*signal (int signo, void (*func) (int))) (int);这样来分解这个声明:signal (int signo, void (*func) (int));是一个函数:这个函数有两个参数,一个是int,一个是void (*...
    signal函数声明如下:
    void (*signal (int signo, void (*func) (int))) (int);

    这样来分解这个声明:
    signal (int signo, void (*func) (int));
    是一个函数:
    这个函数有两个参数,一个是int,一个是void (*func)(int))
    返回值是一个函数指针:void (*)(int)
    展开全文
  • Signal函数

    2018-07-06 11:32:00
    Signal函数: 这个函数是一种系统调用,就是告诉系统发生中断的时候用该干嘛。第一个参数就是信号的编号,第二个参数就是信号的指针。 原型: #include <signal.h> void ( *signal(int sig, void (*...

    Signal函数:

             这个函数是一种系统调用,就是告诉系统发生中断的时候用该干嘛。第一个参数就是信号的编号,第二个参数就是信号的指针。

    原型:

    #include <signal.h>
    
    void ( *signal(int sig, void (*handler)(int)) ) (int);

             第一个参数sig:要传入需要修改处理函数的信号编号。

             第二个参数:是一个无返回值类型,接受一个int形参的函数指针,指向对sig信号的新处理函数。

             第二个参数有三种选择:

    1.自己定义的信号处理函数

    2.传入SIG_DEF表示将之前signal所改变的信号处理方式还原

    3.传入SIG_IGN表示处理方式为忽略信号,内核会直接将信号丢弃,不会传递给进程

     

    SIGHUP 挂起信号
    
    SIGINT 中断信号
    
    SIGQUIT 退出信号
    
    SIGILL 非法指令
    
    SIGTRAP 跟踪/断点中断
    
    SIGABRT 放弃
    
    SIGFPE 浮点异常
    
    SIGKILL 删除(不能捕获或者忽略)
    
    SIGBUS 总线错误
    
    SIGEGV分段错误
    
    SIGSYS 系统调用错误参数
    
    SIGPIPE 管道错误
    
    SIGALRM 闹钟
    
    SIGTERM 软件终止
    
    SIGUSR1 用户信号1
    
    SIGUSR2 用户信号2
    
    SIGCHLD子状态改变
    
    SIGPWR 功能失败/重新启动
    
    SIGWINCH 窗口大小改变
    
    SIGUGR 紧急网络界面接口条件
    
    SIGPOLL 可修改的事件发生
    
    SIGSTOP 停止(不能捕获或忽略)
    
    SIGTSTP 用户停止请求
    
    SIGCONT停止的进程继续进行
    
    signal(SIGHUP, SIG_IGN);

    转载于:https://www.cnblogs.com/wuwangchuxin0924/p/9272721.html

    展开全文
  • 函数signal

    2018-10-14 22:05:04
    1. 函数signal #include &lt;signal.h&gt; void (*signal(int sig,void (*func)(int)))(int) typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 分析: ...

    1. 函数signal

    #include <signal.h>
    void (*signal(int sig,void (*func)(int)))(int)
    
    typedef void (*sighandler_t)(int);
    sighandler_t signal(int signum, sighandler_t handler);

    分析:

    • signal参数信号名,func的值是SIG_ING、SIG_DFL或接到此信号后要调用的函数的地址
    • 如果指定SIG_ING,则向内核表示忽略此信号(记住有两个信号SIGKILL和SIGSTOP不能忽略)
    • 如果指定SIG_DEFL,则表示接到此信号后的动作是系统默认动作
    • 当指定函数地址时, 则在此信号发生时,调用该函数,我们称这种处理为捕捉该信号。

     

    2. 测试代码

    1. 测试代码:

    #include<signal.h>
    #include<stdio.h>
    #include<unistd.h>
    
    void sig_usr(int signo)
    {
        if(signo == SIGUSR1)
          printf("receive SIGUSR1\n");
        else if(signo == SIGUSR2)
          printf("receive SIGUSR2\n");
        else
          perror("signal error");
    }
    
    int main()
    {
        if(signal(SIGUSR1, sig_usr) == SIG_ERR)
          perror("can't catch SIGUSR1");
        if(signal(SIGUSR2, sig_usr) == SIG_ERR)
          perror("can't catch SIGUSR2");
        for( ; ; )
          sleep(1);
        return 0;
    }

    输出结果:

     

    2. 测试代码:

    #include <signal.h>
    #include <stdio.h>
    #include <errno.h>
    
    typedef void(*sighandler_t) (int);
    void catchsigiht(int signo)
    {
        printf("-----------------------------------catch\n");
    }
    
    int main()
    {
        sighandler_t handler;
        handler = signal(SIGINT, catchsigint);
        if (handler == SIG_ERR) {
            perror("signal error");
            exit(1);
        }
        while (1);
        return 0;
    }

    输出结果:

    展开全文
  • signal 函数

    2014-02-02 22:07:59
    执行了signal()调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行func()函数。当func()函数执行结束后,控制权返回进程被中断的那一点继续执行。 目录 1函数名: ...
  • signal函数的使用

    2010-10-16 18:40:54
    signal系统函数调用提供了一种最简单的范例。然而,由于C原形声明的缘故使它看起来比实际复杂。signal函数将一个给定的函数和一个特定的信号联系。这里是FreeBSD中的定义(和一个typedef一起):
  • sigaction函数和signal函数

    千次阅读 2013-03-13 16:36:51
    signal都是指以前的older signal函数,现在大多系统都用sigaction重新实现了signal函数。 1. signal在调用handler之前先把信号的handler指针恢复;sigaction调用之后不会恢复handler指针,直到再次调用sigaction...
  • signal函数详解

    千次阅读 2018-03-07 10:28:49
    SIGABRT 进程停止运行 6 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 2 SIGKILL 停止进程(此信号不能被忽略或捕获) SIGPIPE 向没有读的管道写入数据 ...
  • 理解signal函数

    千次阅读 2006-04-22 22:04:00
    关键字:Unix , Linux, signal, 函数指针,指针函数在Unix/Linux中signal函数是比较复杂的一个,其定义原型如下:void (*signal(int signo,void (*func)(int))) (int)这个函数中,最外层的函数体void (* XXX )(int)表明...
  • Linux signal函数

    2016-11-06 20:46:57
    函数原型 void (*signal(int signum,void(* handler)(int)))(int); 或者:typedef void(*sig_t) ( int ); 或者:sig_t signal(int signum,sig_thandler); unix环境高级编程的例子 #in
  • linux signal 函数

    2013-11-01 21:58:18
    linux中信号机制里面最简单的接口就是signal函数了。 原型如下: #include void ( * signal ( int signo , void ( * func ) ( int ) ) ) ( int ) ; signo参数是信号名 func :(1)SIG_IGN 直接忽略  (2)SIG...
  • signal函数说明

    2011-11-09 11:23:32
    c traps and pitfalls 对signal函数解释得非常详细。 中 void ( *signal( int sig, void (* handler)( int ))) ( int ); int (*p)(); 这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一...
  • signal函数简介

    2013-03-23 10:41:42
    函数名: signal 表头文件 #include  功 能: 设置某一信号的对应动作  函数原型 :void (*signal(int signum,void(* handler)(int)))(int);  或者:typedef void(*sig_t) ( int );  sig_t signal...
  • signal函数使用

    2012-01-13 11:01:22
    函数名: signal 表头文件 #include 功 能: 设置某一信号的对应动作 函数原型 :void (*signal(int signum,void(* handler)(int)))(int); 或者:typedef void(*sig_t) ( int ); sig_t signal(int signum,sig_...

空空如也

1 2 3 4 5 ... 20
收藏数 34,780
精华内容 13,912
关键字:

signal