信号处理相关函数

/* Signals.  */
#define    SIGHUP        1    /* Hangup (POSIX).  */
#define    SIGINT        2    /* Interrupt (ANSI).  */
#define    SIGQUIT        3    /* Quit (POSIX).  */
#define    SIGILL        4    /* Illegal instruction (ANSI).  */
#define    SIGTRAP        5    /* Trace trap (POSIX).  */
#define    SIGABRT        6    /* Abort (ANSI).  */
#define    SIGIOT        6    /* IOT trap (4.2 BSD).  */
#define    SIGBUS        7    /* BUS error (4.2 BSD).  */
#define    SIGFPE        8    /* Floating-point exception (ANSI).  */
#define    SIGKILL        9    /* Kill, unblockable (POSIX).  */
#define    SIGUSR1        10    /* User-defined signal 1 (POSIX).  */
#define    SIGSEGV        11    /* Segmentation violation (ANSI).  */
#define    SIGUSR2        12    /* User-defined signal 2 (POSIX).  */
#define    SIGPIPE        13    /* Broken pipe (POSIX).  */
#define    SIGALRM        14    /* Alarm clock (POSIX).  */
#define    SIGTERM        15    /* Termination (ANSI).  */
#define    SIGSTKFLT    16    /* Stack fault.  */
#define    SIGCLD        SIGCHLD    /* Same as SIGCHLD (System V).  */
#define    SIGCHLD        17    /* Child status has changed (POSIX).  */
#define    SIGCONT        18    /* Continue (POSIX).  */
#define    SIGSTOP        19    /* Stop, unblockable (POSIX).  */
#define    SIGTSTP        20    /* Keyboard stop (POSIX).  */
#define    SIGTTIN        21    /* Background read from tty (POSIX).  */
#define    SIGTTOU        22    /* Background write to tty (POSIX).  */
#define    SIGURG        23    /* Urgent condition on socket (4.2 BSD).  */
#define    SIGXCPU        24    /* CPU limit exceeded (4.2 BSD).  */
#define    SIGXFSZ        25    /* File size limit exceeded (4.2 BSD).  */
#define    SIGVTALRM    26    /* Virtual alarm clock (4.2 BSD).  */
#define    SIGPROF        27    /* Profiling alarm clock (4.2 BSD).  */
#define    SIGWINCH    28    /* Window size change (4.3 BSD, Sun).  */
#define    SIGPOLL        SIGIO    /* Pollable event occurred (System V).  */
#define    SIGIO        29    /* I/O now possible (4.2 BSD).  */
#define    SIGPWR        30    /* Power failure restart (System V).  */
#define SIGSYS        31    /* Bad system call.  */
#define SIGUNUSED    31

#define    _NSIG        65    /* Biggest signal number + 1
                   (including real-time signals).  */


typedef void (*__sighandler_t) (int);

extern __sighandler_t signal (int __sig, __sighandler_t __handler)  __THROW;  //注册信号捕捉函数

/* Fake signal functions.  */
#define SIG_ERR    ((__sighandler_t) -1)        /* Error return.  */
#define SIG_DFL    ((__sighandler_t) 0)        /* Default action.  */
#define SIG_IGN    ((__sighandler_t) 1)        /* Ignore signal.  */
extern int kill (__pid_t __pid, int __sig) __THROW;  //向进程pid发送信号sig

extern int raise (int __sig) __THROW;    //向本进程发送信号sig

extern unsigned int alarm (unsigned int __seconds) __THROW;

extern unsigned int sleep (unsigned int __seconds);

extern int pause (void);

extern void abort (void) __THROW __attribute__ ((__noreturn__));


extern int sigemptyset (sigset_t *__set) __THROW __nonnull ((1));

extern int sigfillset (sigset_t *__set) __THROW __nonnull ((1));

extern int sigaddset (sigset_t *__set, int __signo) __THROW __nonnull ((1));

extern int sigdelset (sigset_t *__set, int __signo) __THROW __nonnull ((1));

extern int sigismember (__const sigset_t *__set, int __signo) __THROW __nonnull ((1));

extern int sigprocmask (int __how, __const sigset_t *__restrict __set,  sigset_t *__restrict __oset) __THROW;

extern int sigpending (sigset_t *__set) __THROW __nonnull ((1));

extern int sigsuspend (__const sigset_t *__set) __nonnull ((1));

extern int sigaction (int __sig, __const struct sigaction *__restrict __act,  struct sigaction *__restrict __oact) __THROW;

struct sigaction
  {
    /* Signal handler.  */
#ifdef __USE_POSIX199309
    union
      {
    /* Used if SA_SIGINFO is not set.  */
    __sighandler_t sa_handler;
    /* Used if SA_SIGINFO is set.  */
    void (*sa_sigaction) (int, siginfo_t *, void *);
      }
    __sigaction_handler;
# define sa_handler    __sigaction_handler.sa_handler
# define sa_sigaction    __sigaction_handler.sa_sigaction
#else
    __sighandler_t sa_handler;
#endif

    /* Additional set of signals to be blocked.  */
    __sigset_t sa_mask;

    /* Special flags.  */
    int sa_flags;

    /* Restore handler.  */
    void (*sa_restorer) (void);
  };


代码示例:

#include    "unp.h"
#include "apue.h"
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
        
        
#include 
        
        
          #include 
         
           #include 
          
            //#include 
           
             //#include 
            
              static sigjmp_buf jmp_buffer; void sleep_handler(int); int my_sleep(int sec) { struct sigaction my_act; struct sigaction my_oact; //上次的sigaction值 /*初始化*/ my_act.sa_handler = sleep_handler; //注册信号处理函数 sigemptyset(&my_act.sa_mask); //不增加新的信号屏蔽位 my_act.sa_flags = 0; //不接收额外信息 my_act.sa_restorer = NULL; /*注册信号捕捉函数*/ if(sigaction(SIGALRM, &my_act, &my_oact) < 0) { puts("signal registration error"); return sec; } /*时钟超时后,回到这一句执行*/ if(sigsetjmp(jmp_buffer, 1) == 0) { //设置超时时间 alarm(sec); pause(); } //重新将超时时钟设为0 return alarm(0); } void sleep_handler(int signo) { siglongjmp(jmp_buffer, 1); return; } int main(int argc, char *argv[]) { sigset_t sig_test; sigset_t sig_otest; sigset_t sig_test2; int rv; sigemptyset(&sig_test); if((rv = sigismember(&sig_test, SIGALRM)) == 1) { puts("1:SIGALRM is set"); } else if(rv == 0) { puts("1:SIGALRM is not set"); } sigfillset(&sig_test); if((rv = sigismember(&sig_test, SIGALRM)) == 1) { puts("2:SIGALRM is set"); } else if(rv == 0) { puts("2:SIGALRM is not set"); } sigemptyset(&sig_test); sigaddset(&sig_test, SIGUSR1); if((rv = sigismember(&sig_test, SIGUSR1)) == 1) { puts("3:SIGUSR1 is set"); } else if(rv == 0) { puts("3:SIGUSR1 is not set"); } sigdelset(&sig_test, SIGUSR1); if((rv = sigismember(&sig_test, SIGUSR1)) == 1) { puts("4:SIGUSR1 is set"); } else if(rv == 0) { puts("4:SIGUSR1 is not set"); } sigaddset(&sig_test, SIGUSR1); sigprocmask(SIG_BLOCK, &sig_test, &sig_otest); raise(SIGUSR1); sigpending(&sig_test2); if((rv = sigismember(&sig_test2, SIGUSR1)) == 1) { puts("5:SIGUSR1 is pending"); } else if(rv == 0) { puts("5:SIGUSR1 is not pending"); } puts("before sleep"); my_sleep(5); puts("after sleep"); exit(0); } 
             
            
           
          
        
       
       
      
      
     
     
    
    
#include    "unp.h"
#include "apue.h"
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
        
        
#include 
        
        
          #include 
         
           #include 
          
            static jmp_buf jmp_buffer; void sleep_handler(int); int my_sleep(int sec) { /*注册信号捕捉函数*/ if(signal(SIGALRM, sleep_handler) == SIG_ERR) { puts("signal registration error"); return sec; } /*时钟超时后,回到这一句执行*/ if(setjmp(jmp_buffer) == 0) { //设置超时时间 alarm(sec); pause(); } //重新将超时时钟设为0 return alarm(0); } void sleep_handler(int signo) { longjmp(jmp_buffer, 1); return; } int main(int argc, char *argv[]) { puts("before sleep"); my_sleep(5); puts("after sleep"); exit(0); } 
           
          
        
       
       
      
      
     
     
    
    



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值