Linux进程间通信学习:信号集函数
|
副标题[/!--empirenews.page--] 我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程。那么我们应该如何设定我们需要处理的信号,我们不需要处理哪些信号等问题呢?信号集函数就是帮助我们解决这些问题的。 有关Linux进程间使用信号通信的更多内容,可以参阅我的另一篇文章——Linux进程间通信——使用信号 下面是信号函数集: 1、int sigemptyset(sigset_t *set); 该函数的作用是将信号集初始化为空。 2、int sigfillset(sigset_t *set); 该函数的作用是把信号集初始化包含所有已定义的信号。 3、int sigaddset(sigset_t *set, int signo); 该函数的作用是把信号signo添加到信号集set中,成功时返回0,失败时返回-1。 4、int sigdelset(sigset_t *set, int signo); 该函数的作用是把信号signo从信号集set中删除,成功时返回0,失败时返回-1. 5、int sigismember(sigset_t *set, int signo); 该函数的作用是判断给定的信号signo是否是信号集中的一个成员,如果是返回1,如果不是,返回0,如果给定的信号无效,返回-1; 6、int sigpromask(int how, const sigset_t *set, sigset_t *oset); 该函数可以根据参数指定的方法修改进程的信号屏蔽字。新的信号屏蔽字由参数set(非空)指定,而原先的信号屏蔽字将保存在oset(非空)中。如果set为空,则how没有意义,但此时调用该函数,如果oset不为空,则把当前信号屏蔽字保存到oset中。 how的不同取值及操作如下所示:
如果sigpromask成功完成返回0,如果how取值无效返回-1,并设置errno为EINVAL。 注意:调用这个函数才能改变进程的屏蔽字,之前的函数都是为改变一个变量的值而已,并不会真正影响进程的屏蔽字。 7、int sigpending(sigset_t *set); 该函数的作用是将被阻塞的信号中停留在待处理状态的一组信号写到参数set指向的信号集中,成功调用返回0,否则返回-1,并设置errno表明错误原因。 8、int sigsuspend(const sigset_t *sigmask); 该函数通过将进程的屏蔽字替换为由参数sigmask给出的信号集,然后挂起进程的执行。注意操作的先后顺序,是先替换再挂起程序的执行。程序将在信号处理函数执行完毕后继续执行。如果接收到信号终止了程序,sigsuspend就不会返回,如果接收到的信号没有终止程序,sigsuspend就返回-1,并将errno设置为EINTR。 特别提醒:如果一个信号被进程阻塞,它就不会传递给进程,但会停留在待处理状态,当进程解除对待处理信号的阻塞时,待处理信号就会立刻被处理。 查看本栏目更多精彩内容:http://www.bianceng.cn/OS/Linux/ (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


