zoukankan      html  css  js  c++  java
  • 第10章信号总结

    1 常见的信号

     不能被捕捉或忽略的信号:SIGKILL、SIGSTOP 杀死和停止一个进程的可靠方法

     SIGCHLD:进程终止或停止时,SIGCHLD信号发送给其父进程,系统默认忽略此信号

     SIGCONT:发送给处于停止状态需要继续运行的进程

     SIGHUP:终端接口断开连接时,此信号发送给该终端相关的控制进程(会话首进程)

     SIGINT:中断进程信号

     SIGQUIT:退出键

     SIGIO:指示异步I/O事件

     SIGPIPE:写已经读关闭的管道时产生此信号

     SIGPOLL:在一个可轮询设备上发生特定事件时产生此信号

     SIGTTIN:后台进程组试图读控制终端时产生此信号

     SIGTTOU:后台进程组试图写控制终端时产生此信号(可以选择允许后台进程组写控制终端,这种情况下不会产生此信号)

    2 signal函数

     void (*signal(int signo,void (*func)(int)))(int)

     设置信号signo的处理函数,这种设置会被子进程继承,但是exec会破坏这种继承(因为进程空间都被替换了) 

     func常量值:SIG_IGN,SIG_DFL,表示忽略与默认

    3 几个函数

    #include <signal.h>
    int kill(pid_t pid,int signo)
    int raise(int signo)

     kill函数中,pid>0发送给特定进程pid,pid=0发送给同一进程组所有进程,pid<-1发送给进程组|pid|中所有进程,pid=-1发送给所有有权发送的进程

    #include <unistd.h>
    unsigned int alarm(unsigned int seconds)
    int pause()

    3 信号集sigset_t

    #include <signal.h>
    int sigemptyset(sigset_t *set)
    int sigfillset(sigset_t *set)
    int sigaddset(sigset_t *set,int signo)
    int sigdelset(sigset_t *set,int signo)
    int sigismember(sigset_t *set,int signo)
    
    int sigprocmask(int how,const sigset_t *set,sigset_t *oset)

     sigprocmask用来设置和查看当前进程的信号屏蔽字(通过set设置,通过oset返回原来的信号屏蔽字)

     how控制设置方式:SIG_BLOCK:将set中的信号加入当前信号屏蔽字

              SIG_UNBLOCK:将set中的信号从当前信号屏蔽字中删除

              SIG_SETMASK:进程的信号屏蔽字替换为set

    int sigpending(sigset_t *set)

     sigpending函数通过set返回产生了但是被当前进程阻塞的进程

    int sigaction(int signo,struct sigaction *act,struct sigaction *oact)
    
    struct sigaction
    {
        void (*sa_handler)(int);
        sigset_t sa_mask;
        int sa_flags;
        void (*sa_sigaction)(int,siginfo_t *,void *);
    };

     sigaction函数比signal函数提供了关于某一信号的更多的设置(处理信号处理函数外)

     sa_handler是信号处理函数指针

     sa_mask是信号屏蔽字(执行该信号处理函数时,添加到信号屏蔽字中的信号,执行完信号处理函数后再回复信号屏蔽字)

     sa_flags一些处理选项

     sa_sigaction是替代信号处理函数指针,sa_flags中制定了某些选项后将以sa_sigaction指向的函数作为信号处理函数

    #include <setjmp.h>
    int sigsetjmp(sigjmp_buf env,int savemask)
    int siglongjmp(sigjmp_buf env,int val)

     sigsetjmp比setjmp函数增加了savemask标志,指明是否保存当前的信号屏蔽字

    int sigsuspend(const sigset_t *sigmask)

     将进程的信号屏蔽字设置为sigmask并挂起,直到捕捉到某个信号并从信号处理程序返回,结束挂起并恢复信号屏蔽字

  • 相关阅读:
    sqlserver中判断表或临时表是否存在
    Delphi 简单方法搜索定位TreeView项
    hdu 2010 水仙花数
    hdu 1061 Rightmost Digit
    hdu 2041 超级楼梯
    hdu 2012 素数判定
    hdu 1425 sort
    hdu 1071 The area
    hdu 1005 Number Sequence
    hdu 1021 Fibonacci Again
  • 原文地址:https://www.cnblogs.com/buptlyn/p/4158592.html
Copyright © 2011-2022 走看看