signal_signalr - CSDN
精华内容
参与话题
  • Linux 信号signal处理函数

    千次阅读 2010-10-16 18:11:00
    alarm(设置信号传送闹钟)相关函数 signal,sleep表头文件 #include定义函数 unsigned int alarm(unsigned int seconds);函数说明 alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果...

    alarm(设置信号传送闹钟)
    相关函数 signal,sleep

    表头文件 #include<unistd.h>

    定义函数 unsigned int alarm(unsigned int seconds);

    函数说明 alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds 为0,则之前设置的闹钟会被取消,并将剩下的时间返回。

    返回值返回之前闹钟的剩余秒数,如果之前未设闹钟则返回0。

     

    范例

    #include<unistd.h>
    #include<signal.h>
    void handler() {
    printf("hello/n");
    }
    main()
    {
    int i;
    signal(SIGALRM,handler);
    alarm(5);
    for(i=1;i<7;i++){
    printf("sleep %d .../n",i);
    sleep(1);
    }
    }

    执行

    sleep 1 ...
    sleep 2 ...
    sleep 3 ...
    sleep 4 ...
    sleep 5 ...
    hello
    sleep 6 ...

     

     


    kill(传送信号给指定的进程)
    相关函数 raise,signal

    表头文件

    #include<sys/types.h>
    #include<signal.h>

    定义函数 int kill(pid_t pid,int sig);

    函数说明 kill()可以用来送参数sig指定的信号给参数pid指定的进程。参数pid有几种情况:
    pid>0 将信号传给进程识别码为pid 的进程。
    pid=0 将信号传给和目前进程相同进程组的所有进程
    pid=-1 将信号广播传送给系统内所有的进程
    pid<0 将信号传给进程组识别码为pid绝对值的所有进程
    参数sig代表的信号编号可参考附录D

    返回值 执行成功则返回0,如果有错误则返回-1。

    错误代码 EINVAL 参数sig 不合法
    ESRCH 参数pid 所指定的进程或进程组不存在
    EPERM 权限不够无法传送信号给指定进程

     

    范例

    #include<unistd.h>
    #include<signal.h>
    #include<sys/types.h>
    #include<sys/wait.h>
    main()
    {
    pid_t pid;
    int status;
    if(!(pid= fork())){
    printf("Hi I am child process!/n");
    sleep(10);
    return;
    }
    else{
    printf("send signal to child process (%d) /n",pid);
    sleep(1);
    kill(pid ,SIGABRT);
    wait(&status);
    if(WIFSIGNALED(status))
    printf("chile process receive signal %d/n",WTERMSIG(status));
    }
    }

    执行

    Hi I am child process!
    send signal to child process(13700)
    child process receive signal 6

     

     


    pause(让进程暂停直到信号出现)
    相关函数 kill,signal,sleep

    表头文件 #include<unistd.h>

    定义函数 int pause(void);

    函数说明 pause()会令目前的进程暂停(进入睡眠状态),直到被信号(signal)所中断。

    返回值 只返回-1。

    错误代码 EINTR 有信号到达中断了此函数。

     

     


    sigaction(查询或设置信号处理方式)
    相关函数 signal,sigprocmask,sigpending,sigsuspend

    表头文件 #include<signal.h>

    定义函数 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

    函数说明 sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号。
    如参数结构sigaction定义如下
    struct sigaction
    {
    void (*sa_handler) (int);
    sigset_t sa_mask;
    int sa_flags;
    void (*sa_restorer) (void);
    }
    sa_handler此参数和signal()的参数handler相同,代表新的信号处理函数,其他意义请参考signal()。
    sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号搁置。
    sa_restorer 此参数没有使用。
    sa_flags 用来设置信号处理的其他相关操作,下列的数值可用。
    OR 运算(|)组合
    A_NOCLDSTOP : 如果参数signum为SIGCHLD,则当子进程暂停时并不会通知父进程
    SA_ONESHOT/SA_RESETHAND:当调用新的信号处理函数前,将此信号处理方式改为系统预设的方式。
    SA_RESTART:被信号中断的系统调用会自行重启
    SA_NOMASK/SA_NODEFER:在处理此信号未结束前不理会此信号的再次到来。
    如果参数oldact不是NULL指针,则原来的信号处理方式会由此结构sigaction 返回。

    返回值 执行成功则返回0,如果有错误则返回-1。

    错误代码

    EINVAL 参数signum 不合法,或是企图拦截SIGKILL/SIGSTOPSIGKILL信号
    EFAULT 参数act,oldact指针地址无法存取。
    EINTR 此调用被中断

    参考:

    <signal.h>

    http://opengroup.org/onlinepubs/007908775/xsh/sigaction.html

    http://opengroup.org/onlinepubs/007908775/xsh/signal.h.html

     

    范例

    #include<unistd.h>
    #include<signal.h>
    void show_handler(struct sigaction * act)
    {
    switch (act->sa_flags)
    {
    case SIG_DFL:printf("Default action/n");break;
    case SIG_IGN:printf("Ignore the signal/n");break;
    default: printf("0x%x/n",act->sa_handler);
    }
    }
    main()
    {
    int i;
    struct sigaction act,oldact;
    act.sa_handler = show_handler;
    act.sa_flags = SA_ONESHOT|SA_NOMASK;
    sigaction(SIGUSR1,&act,&oldact);
    for(i=5;i<15;i++)
    {
    printf("sa_handler of signal %2d =".i);
    sigaction(i,NULL,&oldact);
    }
    }

    执行 sa_handler of signal 5 = Default action
    sa_handler of signal 6= Default action
    sa_handler of signal 7 = Default action
    sa_handler of signal 8 = Default action
    sa_handler of signal 9 = Default action
    sa_handler of signal 10 = 0x8048400
    sa_handler of signal 11 = Default action
    sa_handler of signal 12 = Default action
    sa_handler of signal 13 = Default action
    sa_handler of signal 14 = Default action

     

    sigaddset(增加一个信号至信号集)
    相关函数 sigemptyset,sigfillset,sigdelset,sigismember

    表头文件 #include<signal.h>

    定义函数 int sigaddset(sigset_t *set,int signum);

    函数说明 sigaddset()用来将参数signum 代表的信号加入至参数set 信号集里。

    返回值执行成功则返回0,如果有错误则返回-1。

    错误代码 EFAULT 参数set指针地址无法存取
    EINVAL 参数signum非合法的信号编号

     

     


    sigdelset(从信号集里删除一个信号)
    相关函数 sigemptyset,sigfillset,sigaddset,sigismember

    表头文件 #include<signal.h>

    定义函数 int sigdelset(sigset_t * set,int signum);

    函数说明 sigdelset()用来将参数signum代表的信号从参数set信号集里删除。

    返回值 执行成功则返回0,如果有错误则返回-1。

    错误代码 EFAULT 参数set指针地址无法存取
    EINVAL 参数signum非合法的信号编号

     

     


    sigemptyset(初始化信号集)
    相关函数 sigaddset,sigfillset,sigdelset,sigismember

    表头文件 #include<signal.h>

    定义函数 int sigemptyset(sigset_t *set);

    函数说明 sigemptyset()用来将参数set信号集初始化并清空。

    返回值 执行成功则返回0,如果有错误则返回-1。

    错误代码 EFAULT 参数set指针地址无法存取

     

     


    sigfillset(将所有信号加入至信号集)
    相关函数 sigempty,sigaddset,sigdelset,sigismember

    表头文件 #include<signal.h>

    定义函数 int sigfillset(sigset_t * set);

    函数说明 sigfillset()用来将参数set信号集初始化,然后把所有的信号加入到此信号集里。

    返回值 执行成功则返回0,如果有错误则返回-1。

    附加说明 EFAULT 参数set指针地址无法存取

     

     


    sigismember(测试某个信号是否已加入至信号集里)
    相关函数 sigemptyset,sigfillset,sigaddset,sigdelset

    表头文件 #include<signal.h>

    定义函数 int sigismember(const sigset_t *set,int signum);

    函数说明 sigismember()用来测试参数signum 代表的信号是否已加入至参数set信号集里。如果信号集里已有该信号则返回1,否则返回0。

    返回值信号集已有该信号则返回1,没有则返回0。如果有错误则返回-1。

    错误代码 EFAULT 参数set指针地址无法存取
    EINVAL 参数signum 非合法的信号编号

     

     


    signal(设置信号处理方式)
    相关函数 sigaction,kill,raise

    表头文件 #include<signal.h>

    定义函数 void (*signal(int signum,void(* handler)(int)))(int);

    函数说明 signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。如果参数handler不是函数指针,则必须是下列两个常数之一:
    SIG_IGN 忽略参数signum指定的信号。
    SIG_DFL 将参数signum 指定的信号重设为核心预设的信号处理方式。
    关于信号的编号和说明,请参考附录D

    返回值返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。

    附加说明在信号发生跳转到自定的handler处理函数执行后,系统会自动将此处理函数换回原来系统预设的处理方式,如果要改变此操作请改用sigaction()。

    范例 参考alarm()或raise()。

     

     


    sigpending(查询被搁置的信号)
    相关函数 signal,sigaction,sigprocmask,sigsuspend

    表头文件 #include<signal.h>

    定义函数 int sigpending(sigset_t *set);

    函数说明 sigpending()会将被搁置的信号集合由参数set指针返回。

    返回值执 行成功则返回0,如果有错误则返回-1。

    错误代码 EFAULT 参数set指针地址无法存取
    EINTR 此调用被中断。

     

     


    sigprocmask(查询或设置信号遮罩)
    相关函数 signal,sigaction,sigpending,sigsuspend

    表头文件 #include<signal.h>

    定义函数 int sigprocmask(int how,const sigset_t *set,sigset_t * oldset);

    函数说明 sigprocmask()可以用来改变目前的信号遮罩,其操作依参数how来决定
    SIG_BLOCK 新的信号遮罩由目前的信号遮罩和参数set 指定的信号遮罩作联集
    SIG_UNBLOCK 将目前的信号遮罩删除掉参数set指定的信号遮罩
    SIG_SETMASK 将目前的信号遮罩设成参数set指定的信号遮罩。
    如果参数oldset不是NULL指针,那么目前的信号遮罩会由此指针返回。

    返回值 执行成功则返回0,如果有错误则返回-1。

    错误代码 EFAULT 参数set,oldset指针地址无法存取。
    EINTR 此调用被中断

     

     


    sleep(让进程暂停执行一段时间)
    相关函数 signal,alarm

    表头文件 #include<unistd.h>

    定义函数 unsigned int sleep(unsigned int seconds);

    函数说明 sleep()会令目前的进程暂停,直到达到参数seconds 所指定的时间,或是被信号所中断。

    返回值 若进程暂停到参数seconds 所指定的时间则返回0,若有信号中断则返回剩余秒数。

     

     

    转载声明: 本文转自 http://www.cnblogs.com/taobataoma/archive/2007/08/30/875662.html

    展开全文
  • signal() 函数详解

    万次阅读 2017-11-20 10:06:33
    signal() 函数详解   转载 signal()函数详解: 在 这个头文件中。 signal(参数1,参数2); 参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些...

    signal() 函数详解

     
    signal()函数详解:

    在 这个头文件中。
    signal(参数1,参数2);
    参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。
    参数2:我们处理的方式(是系统默认还是忽略还是捕获)。
    一般有3中方式进行操作。

    (1)eg: signal(SIGINT ,SIG_ING );
    //SIG_ING 代表忽略SIGINT信号,SIGINT信号代表由InterruptKey产生,通常是CTRL +C 或者是DELETE 。发送给所有ForeGround Group的进程。
    下面我们写个死循环:
    #include
    #include
    int main(int argc , char *argv[])
    {
    signal(SIGINT,SIG_IGN);
    for(;;);
    return 0;
    }
    这时我们保存执行。
    按下CTRL _C程序没有反应。这就对了
    如果我们想结束该程序可以按下CTRL +\来结束
    其实当我们按下CTRL +\组合键时,是产生了SIGQUIT信号

    (2)eg: signal(SIGINT ,SIG_DFL );
    //SIGINT信号代表由InterruptKey产生,通常是CTRL +C或者是DELETE。发送给所有ForeGroundGroup的进程。 SIG_DFL代表执行系统默认操作,其实对于大多数信号的系统默认动作时终止该进程。这与不写此处理函数是一样的。
    我们将上面的程序改成:
    #include
    #include
    int main(int argc , char *argv[])
    {
    //signal(SIGINT,SIG_IGN);
    signal(SIGINT,SIG_DFL)
    for(;;);
    return 0;
    }
    这时就可以按下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 +\ 打印结果为最后一行。

     



        ------------------------------------------------------------------------------


    Linux kill 命令补充说明:

    功能说明:删除执行中的程序或工作。

    语  法:kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]


    补充说明:kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或jobs指令查看。 

    参  数:

     -l <信息编号>  若不加<信息编号>选项,则-l参数会列出全部的信息名称。 

     -s <信息名称或编号>  指定要送出的信息。 

     [程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号。




    一些常用的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 ()函数详细介绍 Linux函数

    万次阅读 多人点赞 2012-06-13 22:16:27
    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);这句去掉,效果是一样的。

    3void ( *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专用,进程超过资源限制的时候发送

    展开全文
  • 【Linux函数】Signal ()函数详细介绍

    万次阅读 多人点赞 2016-06-21 19:49:56
    声明#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);3. 参数说明 第一个参数signum:指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP...

    1. 功能

    设置某一信号的对应动作

    2. 声明

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

    3. 参数说明 

    第一个参数signum:指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。  
    第二个参数handler:描述了与信号关联的动作,它可以取以下三种值:
      

    (1)SIG_IGN   

    这个符号表示忽略该信号。
    例如:

    #include <stdio.h>
    #include <signal.h>
    int main(int argc, char *argv[]) {
        signal(SIGINT, SIG_IGN);
        while(1);
        return 0;
    }

    SIGINT信号代表由InterruptKey产生,通常是CTRL +C 或者是DELETE 。执行上述代码时,按下CTRL + C程序没有反应。这就对了,如果我们想结束该程序可以按下CTRL +\来结束,当我们按下CTRL +\组合键时,产生了SIGQUIT信号,此信号并没有被忽略。

    (2)SIG_DFL   

    这个符号表示恢复对信号的系统默认处理。不写此处理函数默认也是执行系统默认操作。
    例如

    #include <stdio.h>
    #include <signal.h>
    int main(int argc, char *argv[]) {
        signal(SIGINT, SIG_DFL);
        while(1);
        return 0;
    }

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

    (3)sighandler_t类型的函数指针
      
    上面提到了sighandler_t类型声明:

    typedef void (*sighandler_t)(int);
    sighandler_t signal(int signum, sighandler_t handler);

    此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为sig的信号时,就执行handler 所指定的函数。(int)signum是传递给它的唯一参数。执行了signal()调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行func()函数。当func()函数执行结束后,控制权返回进程被中断的那一点继续执行。
    例如

    #include <stdio.h>
    #include <signal.h>
    typedef void (*signal_handler)(int);
    
    void signal_handler_fun(int signum) {
        printf("catch signal %d\n", signum);
    }
    
    int main(int argc, char *argv[]) {
        signal(SIGINT, signal_hander_fun);
        while(1);
        return 0;
    }

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

    catch signal 2
    catch signal 2
    catch signal 2
    catch signal 2
    =退出

    每当我们按下CTRL +C键时会打印该信号的number.可以看出该信号的num为2。要想退出可以按下CTRL +\ 打印结果为最后一行。

    4. 函数说明 

    signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。

    当一个信号的信号处理函数执行时,如果进程又接收到了该信号,该信号会自动被储存而不会中断信号处理函数的执行,直到信号处理函数执行完毕再重新调用相应的处理函数。但是如果在信号处理函数执行时进程收到了其它类型的信号,该函数的执行就会被中断。

    5. 返回值

    返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。   

    6. 一些常用的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专用,进程超过资源限制的时候发

    【参考:http://www.360doc.com/content/12/0927/10/7534118_238403050.shtml, 有改动】

    展开全文
  • C语言中signal函数简介及使用

    千次阅读 2019-06-15 11:50:41
    signal.h是C标准函数库中的信号处理部分,定义了程序执行时如何处理不同的信号。信号用作进程间通信,报告异常行为(如除零)、用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT)。C++中的对应头文件是csignal...
  • Signal ()函数详细介绍

    千次阅读 2018-06-20 08:57:45
    signal.h&gt; typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);1233. 参数说明 第一个参数signum:指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的...
  • 常用Signal

    2020-10-12 22:31:37
    一些常用的Signal 如下: Signal Description SIGABRT 由调用abort函数产生,进程非正常退出 SIGALRM 用alarm函数设置的timer超时或setitimer函数设置的interval timer超时 SIGBUS 某种特定的硬件异常,通常由内存...
  • signal()函数介绍

    2018-11-22 20:15:38
    signal.h&gt; signal()函数: typedef void (*__sighandler_t) (int); __sighandler_t signal (int __sig, __sighandler_t __handler); 第一个参数是要捕捉的信号(linux下查看信号:kill -l,9号...
  • 边沿检测和双边采样电路边沿检测双边采样电路 边沿检测 边沿检测,又称沿提取,就是检测信号的上升沿和下降沿。 实现边沿检测,最直接的方法是用两级寄存器。其中第二级寄存器锁存住某个时钟沿到来时的输入电平,...
  • Python信号处理模块signal

    万次阅读 2016-03-25 09:10:18
    Python信号处理模块signalPython中对信号处理的模块主要是使用signal模块,但signal主要是针对Unix系统,所以在Windows平台上Python不能很好的发挥信号处理的功能。要查看Python中的信号量,可以使用dir(signal)来...
  • nginx报错日志 signal process started

    万次阅读 2018-12-28 10:25:55
    ps -ef |grep nginx 查看到有nignx 在运行了, 如果按装了多个nginx 需要修改为不同的端口号 解决办法 1.强制停止nignx ...2.由于我是要在mamp下运行nignx 所以删除掉 mac下载的nignx来避免冲突 ...
  • 前台页面显示:500 Internal Server Error,在nginx日志报的错:ngnix:[notice] 30499#0: signal process started,这是什么问题的错误呢。
  • 电脑系统是win10 64位,在使用python的signal模块时报错:“AttributeError: module 'signal' has no attribute 'SIGALRM'”,这是因为signal模块可以在linux下正常使用,但在windows下却有一些限制,在python文档...
  • qtcreator帮助,插件,去掉ClangCodeModel,重启
  • 显示thread 1:signal SIGABRT 错误

    万次阅读 2018-08-01 11:33:48
    在日志窗口那里查找【reason】,找到后,会有提示,像我的提示就是UIImageView错误,根据提示来排查错误,我就查找每一个和UIImageView有关的警告,就找到了问题所在 像我就是因为初始化错了一个控件,比如应该是...
  • 遇到这样的错误一开始真的很头痛,就这么个简单提示“thread 1: sinal sigabrt”,叫人如何定位是好啊?在没办法之时,突然想到了日志。最终通过查看 log nevigator才看出问题所在。 *** Terminating app due to ...
  • 经常会出现 "Process XXX terminated by signal (X)" 的问题,对应signal的编号及含义可参考: http://linux.about.com/od/commands/l/blcmdl7_signal.htm
  • signal(SIGCHLD, SIG_IGN); 因为并发服务器常常fork很多子进程,子进程终结之后需要服务器进程去wait清理资源。如果将此信号的处理方式设为忽略,可让内核把僵尸子进程转交给init进程去处理,省去了大量僵尸进程...
  • 关于linux signal 6 (SIGABRT)

    万次阅读 2016-11-26 10:29:55
    关于linux signal 6 (SIGABRT)
  • 产生原因: 1、可能你的nginx.conf 内容配置的有问题。 2、./nginx -r reload 启动命令默认加载的nginx.conf 的路径不对。 解决办法: # /data/nginx/sbin -c /data/nginx/conf/nginx.conf  ...
1 2 3 4 5 ... 20
收藏数 290,633
精华内容 116,253
关键字:

signal