sighold,sigset,sigrelse,sigpause,sigignore

本文详细介绍了Linux系统中信号管理的相关功能,包括signal()、sigset()等系统调用。说明了这些调用对指定信号的处理方式、参数含义及返回值,还给出了设置用户自己的信号中断处理函数的示例,如以SIGINT信号为例的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

signal() 
        功能:信号管理功能 
        语法:#include  
             void (*signal(sig,disp))(int) 
             int sig; 
             void (*disp)(int); 

             void (*sigset(sig,disp))(int) 
             int sig; 
             void (*disp)(int); 

             int sighold(sig) 
             int sig; 

             int sigrelse(sig) 
             int sig; 

             int sigignore(sig) 
             int sig; 

             int sigpause(sig) 
             int sig; 
        说明:这些系统调用提供了应用程序对指定信号的简单的信号处理. 
             signal()和sigset()用于修改信号定位.参数sig指定信号(除了 
             SIGKILL和SIGSTOP,这两种信号由系统处理,用户程序不能捕捉到)

             disp指定新的信号定位,即新的信号处理函数指针.可以为 
             SIG_IGN,SIG_DFL或信号句柄地址. 
             若使用signal(),disp是信号句柄地址,sig不能为SIGILL,SIGTRAP

             或SIGPWR,收到该信号时,系统首先将重置sig的信号句柄为SIG_DFL, 
             然后执行信号句柄. 
             若使用sigset(),disp是信号句柄地址,该信号时,系统首先将该 
             信号加入调用进程的信号掩码中,然后执行信号句柄.当信号句柄 

             运行结束 
             后,系统将恢复调用进程的信号掩码为信号收到前的状态.另外, 
             使用sigset()时,disp为SIG_HOLD,则该信号将会加入调用进程的 

             信号掩码中而信号的定位不变. 
             sighold()将信号加入调用进程的信号掩码中. 
             sigrelse()将信号从调用进程的信号掩码中删除. 
             sigignore()将信号的定位设置为SIG_IGN. 
             sigpause()将信号从调用进程的信号掩码中删除,同时挂起调用 
             进程直到收到信号. 
             若信号SIGCHLD的信号定位为SIG_IGN,则调用进程的子进程在终 
             止时不会变成僵死进程.调用进程也不用等待子进程返回并做相 
             应处理. 

        返回值:调用成功则signal()返回最近调用signal()设置的disp的值. 
             否则返回SIG_ERR. 
        例子一:设置用户自己的信号中断处理函数,以SIGINT信号为例: 
             int flag=0; 
             void myself() 
             { 
                 flag=1; 
                 printf("get signal SIGINT\n"); 
                 /*若要重新设置SIGINT信号中断处理函数为本函数则执行以 

                  *下步骤*/ 
                 void (*a)(); 
                 a=myself; 
                 signal(SIGINT,a); 
                 flag=2; 
             } 
             main() 
             { 
                 while (1) { 
                     sleep(2000);  /*等待中断信号*/ 
                     if (flag==1) { 
                         printf("skip system call sleep\n"); 
                         exit(0); 
                     } 
                     if (flag==2) { 
                         printf("skip system call sleep\n"); 
                         printf("waiting for next signal\n"); 
                     } 
                 } 
             }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值