系统相关
首页 > 系统相关> > linux下信号使用

linux下信号使用

作者:互联网

信号singal:
                信号是一种软中断,在程序中每个信号用一个整数表示,为了记忆每个信号都有一个宏定义。
                    SIGKILL 9  进程终止信号
                    SIGSTOP    进程停止信号
                    SIGCONT    进程继续执行信号
                    SIGINT     Ctrl+C发出信号,默认终止进程
                    SIGQUIT    Ctrl+\发出信号,默认终止进程并产生Core文件
                    SIGTSTP    Ctrl+Z发出信号,默认停止进程
                    SIGCHLD    子进程结束信号,默认忽略
                    SIGALRM    闹钟信号,闹钟定时时间到发出的信号,默认终止进程
                自己处理信号:
                    typedef void (*sighandler_t)(int);   //信号处理函数指针,入参是当前处理信号值
                    sighandler_t signal(int signum, sighandler_t handler); //使用signal登记信号处理函数,返回原来的信号处理函数指针
                    signal(信号,SIG_IGN)   //忽略信号
                    signal(信号,SIG_DFL)   //恢复默认信号,返回SIG_ERR表示出错
                    自己处理的信号只能是可以捕获的信号,SIGKILL和SIGSTOP无法捕获。
                    kill -信号 进程id  //用于发送指定信号到指定进程。
                    int kill(pid_t pid, int sig);  //如果pid=0表示向本组的所有进程发送信号,如果sig=0不发信号,但是检测进程id是否存在,成功返回0,失败返回-1。
                    int raise(int sig);  //用于给本进程发信号。
                    信号可能打断正在阻塞中的函数,使该函数以失败返回,一般把errno设置成EINTR。
                    unsigned int alarm(unsigned int seconds);  //设置一个alarm定时器,定时器时间到产生SIGALRM信号,返回值为定时器剩余时间。
                    积压的多个相同的信号可能会合并为一个。
                    struct itimerval {
                        struct timeval it_interval; /* Interval for periodic timer */  第一次之后每次循环定时时间
                        struct timeval it_value;    /* Time until next expiration */  第一次定时时间
                    };
                    struct timeval {
                        time_t      tv_sec;         /* seconds */
                        suseconds_t tv_usec;        /* microseconds */
                    };
                    int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);//可以设置循环定时器
                    int getitimer(int which, struct itimerval *curr_value);
                复杂信号:
                    不可重入问题,使用了全局变量,静态局部变量,可能一直阻塞的函数一般是不可重入的函数。
                         struct passwd {
                           char   *pw_name;       /* username */
                           char   *pw_passwd;     /* user password */
                           uid_t   pw_uid;        /* user ID */
                           gid_t   pw_gid;        /* group ID */
                           char   *pw_gecos;      /* user information */
                           char   *pw_dir;        /* home directory */
                           char   *pw_shell;      /* shell program */
                        };

                        struct passwd *getpwnam(const char *name);  //返回指针,指向的静态局部变量
                        struct passwd *getpwuid(uid_t uid);       //        
                  信号集:sigemptyset(sigset_t *)  //清空信号集
                             sigfillset(sigset_t *)   //填满信号集
                            sigaddset(sigset_t *, int)      //添加信号
                            sigdelset(sigset_t *, int)      //删除信号
                            sigismember(sigset_t *, int)    //判断信号中是否有这个信号                
                        使用信号集可以用来阻塞一组信号。
                            int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); //SIG_BLOCK  SIG_UNBLOCK SIG_SETMASK set为需要添加的信号集,oldset为就信号集
                        阻塞并不丢弃信号,信号来了但是没有被处理叫做未决信号。 sigpending取得处于未决状态的信号集   
                            int sigpending(sigset_t *)  //取得未决的信号集
                    带参数信号的处理:
                            int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); //设置信号的处理方式
                            struct sigaction {
                               void     (*sa_handler)(int);  //无惨信号
                               void     (*sa_sigaction)(int, siginfo_t *, void *);  //带参信号
                               sigset_t   sa_mask;      //屏蔽的信号集
                               int        sa_flags;     //0表示无惨信号处理,SA_SIGINFO表示带参信号处理函数
                               void     (*sa_restorer)(void);  //废弃
                            };
            
                            int sigqueue(pid_t pid, int sig, const union sigval value);  //发送信号,指定进程id,和附带的参数

标签:struct,sigset,int,linux,信号,使用,进程,pw
来源: https://blog.csdn.net/Dam_Sam/article/details/100086274