linux信号 – SIGINT和SIGALRM

linux信号 – SIGINT和SIGALRM符号名  信号值描述                是否符合POSIXSIGHUP  1   在控制终端上检测到挂断或控制线程死亡  是SIGINT  2   交互注意信号              是SIGQUIT 3   交互中止信号              是SIGILL  4   检测到非法硬件的指令          是SIGTRAP 5   从陷阱中回朔  

大家好,欢迎来到IT知识分享网。符号名  信号值 描述                是否符合POSIX

SIGHUP  1   在控制终端上检测到挂断或控制线程死亡  是

SIGINT  2   交互注意信号              是

SIGQUIT  3   交互中止信号              是

SIGILL  4   检测到非法硬件的指令          是

SIGTRAP  5   从陷阱中回朔              否

SIGABRT  6   异常终止信号              是

SIGEMT  7   EMT 指令                否

SIGFPE  8   不正确的算术操作信号          是

SIGKILL  9   终止信号                是

SIGBUS  10   总线错误                否

SIGSEGV  11   检测到非法的内存调用          是

SIGSYS  12   系统call的错误参数           否

SIGPIPE  13   在无读者的管道上写           是

SIGALRM  14   报时信号                是

SIGTERM  15   终止信号                是

SIGURG  16   IO信道紧急信号             否

SIGSTOP  17   暂停信号                是

SIGTSTP  18   交互暂停信号              是

SIGCONT  19   如果暂停则继续             是

SIGCHLD  20   子线程终止或暂停            是

SIGTTIN  21   后台线程组一成员试图从控制终端上读出  是

SIGTTOU  22   后台线程组的成员试图写到控制终端上   是

SIGIO   23   允许I/O信号               否

SIGXCPU  24   超出CPU时限               否

SIGXFSZ  25   超出文件大小限制            否

SIGVTALRM 26   虚时间警报器              否

SIGPROF  27   侧面时间警报器             否

SIGWINCH 28   窗口大小的更改             否

SIGINFO  29   消息请求                否

SIGUSR1  30   保留作为用户自定义的信号1        是

SIGUSR2  31   保留作为用户自定义的信号        是

信号是unix中所使用的进程通信的一种最古老的方法.系统使用它来同志一个或多个进程异步事件的发生.

linux系统库bits/signum.h对信号名作了定义:

linux的大多数信号是提供给内核的,仅有少数几种信号可以在信号间发送.

.SIGHUP 当终止一个终端时,内核就把这种信号发送给该终端所控制的所有进程.

.SIGINT 当一个用户按下中断键(ctrl+c)后,内核就向该终端用关联的所有进程发送这个信号.

.SIGQUIT 当用户按下(ctrl+),内核就向该终端用关联的所有进程发送这个信号.

.SIGILL 当一个进程企图执行一条非法指令时,内核就发送这个信号.

.SIGFPE 当产生浮点错误时,内核就发送这个信号.

.SIGKILL 这是一个非常特殊的信号,他可以从一个进程发送到另一个进程,使接收到该信号的进程终止.内核偶然也发送这种信号.

.SIGALRM 当一个定时器到时的时候,内核就发送这个信号.

.SIGSTOP 子进程结束信号.UNIX用它来实现系统调用exit(),wait();

信号的处理

unix的系统调用signal()用于接受一个指定的信号,并可以指定相应的处理方法.

unix高级编程里提到过,signal()在某些系统里只改变一次信号行为,然后就恢复系统默认。用sigaction就可以了。linux下signal可以永久改变信号行为,solaris中就不行了,要想永久改变可以调用sigaction或sigset

在linux系统库signal.h中,它的说明如下:

signal(int sig,sighandler_t handler);

sig用于指定信号类型.handle是用于处理该信号的函数.

handle还可以是:

.SIG_IGN 忽略这个信号.

.SIG_DFL 恢复对这个信号的默认处理.

例如:

main(){
    signal(SIGINT,SIG_IGN);
    printf(”hello!n”);
    sleep(10);
    printf(”hellon”);
}

上面的代码忽略了SININT信号.

又例如:

int catch(int sig);

main(){
    signal(SIGINT,catch);
    printf(”hello!n”);
    sleep(10);
    printf(”hello!n”);
}

int catch(int sig){
    printf(”catch signaln”);
    return 1;
}

当用户按下ctrl+c时,进程被中断,catch()被执行.中断处理函数处理完毕后,转回断点执行下面的指令.

当编写自己的中断处理函数时,注意下面两点:

1.信号不能打断系统调用.

2.信号不能打断信号处理函数.

alarm(设置信号传送闹钟)

定义函数

unsigned int alarm(unsigned int seconds);

函数说明

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

返回值

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

范例

void handler() {
    printf("hellon");
}
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 ...

int main(int argc, char argv[])
{
    time_t now;
    FILE *fp;
    deamon();//调用创建守护进程
    while(1)
    {
        if((fp=fopen("/home/jerry/test.log","a"))!=NULL)
        {
            now=time(0);
            fprintf(fp,"I'm here at %ld\n",now);
            fclose(fp);
        }
        sleep(6);
    }
}

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/23545.html

(0)
上一篇 2023-09-09 19:45
下一篇 2023-09-10 18:33

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信