我还没完全明白,怎么用sigprocmask().特别是,如何set和oldset它的语法的工作和如何使用它们.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
Run Code Online (Sandbox Code Playgroud)
请解释一个例子,阻止,说SIGUSR1几秒钟,然后解锁并处理它.
我写了一小段代码.此代码首先阻塞{SIGSEGV},然后将SIGRTMIN添加到同一个集合中.所以,我的最终信号集是{SIGSEGV,SIGRTMIN}.因此,如果我使用SIG_UNBLOCK,根据我的理解,第一个SIGRTMIN应该被解除阻塞,然后如果我调用SIG_UNBLOCK,则应该取消阻塞SIGSEGV.
即,1){SIGSEGV,SIGRTMIN} 2)SIG_UNBLOCK = unblock SIGRTMIN,3)再次调用SIG_UNBLOCK = unblock SIGSEGV.我只给了进程一个SIGRTMIN,因此我的第二个unblock应该用SIGRTMIN暂停进程.但事实并非如此.请帮忙. 注意:请不要给sigprocmask()上的其他问题的答案链接,我已经看过他们,他们没有澄清我的问题.
enter code here
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
sigset_t old_set,new_set;
sigemptyset(&old_set);
sigemptyset(&new_set);
if(sigaddset(&old_set,SIGSEGV)==0)
{
printf("sigaddset successfully added for SIGSEGV\n");
}
sigprocmask(SIG_BLOCK,&old_set,NULL); // SIGSEGV signal is masked
kill(0,SIGSEGV);
//*****************************************************************
if(sigaddset(&new_set,SIGRTMIN)==0)
{
printf("sigaddset successfully added for SIGRTMIN\n");
}
sigprocmask(SIG_BLOCK,&new_set,&old_set); // SIGRTMIN signal is masked
kill(0,SIGSEGV);
//****************** Unblock one signal at a time ******************
sigprocmask(SIG_UNBLOCK,&new_set,&old_set); // SIGRTMIN signal is unmasked
sigprocmask(SIG_UNBLOCK,&new_set,&old_set); // SIGSEGV signal is unmasked
Run Code Online (Sandbox Code Playgroud)
}
Output:
[root@dhcppc0 …Run Code Online (Sandbox Code Playgroud) 在macbook(OSX 10.9.5(13F34))上有以下简单程序:
#include <stdio.h>
#include <signal.h>
static void nop(int unused) { }
int
main(void) {
struct sigaction sa, osa;
sigset_t mask;
sigemptyset(&sa.sa_mask);
printf("Errno after sigempty sa_mask: %d\n", errno);
sigemptyset(&osa.sa_mask);
printf("Errno after sigempty oldsa_mask: %d\n", errno);
sa.sa_flags = 0;
sa.sa_handler = nop;
sigprocmask(0, NULL, &mask);
printf("Errno after sigprocmask mask: %d\n", errno);
printf("%d\n", sigismember(&mask, SIGALRM));
sigaction(SIGALRM, &sa, &osa);
printf("Errno after sigaction sa osa: %d\n", errno);
printf("%d\n", sigismember(&osa.sa_mask, SIGALRM));
printf("%d\n", sigismember(&sa.sa_mask, SIGALRM));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
神秘印刷:
Errno after sigempty sa_mask: 0
Errno after …Run Code Online (Sandbox Code Playgroud) 我有一个父进程和两个孩子.父进程只创建两个孩子,一个读者和一个计数器,并等待它的死亡.孩子们做了以下事情.
第一个孩子(读者):
第二个孩子(柜台):
我等待来自另一个进程的信号时遇到麻烦.在调用pause()函数之前可以接收信号,即可以永久阻止进程.我还试图用sigprocmask(),sigsuspend()和sigwaitinfo(),但它不能正常工作.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <signal.h>
#include <string.h>
enum { MAX_LEN = 16 };
void handler(int signo)
{
// do nothing
}
int main(int argc, const char * argv[])
{
sigset_t ss;
sigemptyset(&ss);
sigaddset(&ss, SIGUSR1);
// handle SIGUSR1
signal(SIGUSR1, handler);
// shared memory for file line
char *data = mmap(NULL, …Run Code Online (Sandbox Code Playgroud)