标签: sigprocmask

在sigprocmask()中设置和设置

我还没完全明白,怎么用sigprocmask().特别是,如何setoldset它的语法的工作和如何使用它们.

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
Run Code Online (Sandbox Code Playgroud)

请解释一个例子,阻止,说SIGUSR1几秒钟,然后解锁并处理它.

c posix signals sigprocmask

25
推荐指数
1
解决办法
3万
查看次数

sigprocmask()在UNIX中阻塞信号

我写了一小段代码.此代码首先阻塞{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)

c unix signals sigprocmask

6
推荐指数
1
解决办法
2万
查看次数

OS X sigaction错误地设置了sa_mask

在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)

c macos sigprocmask language-lawyer sigaction

3
推荐指数
1
解决办法
680
查看次数

两个进程之间的顺序信号

我有一个父进程和两个孩子.父进程只创建两个孩子,一个读者和一个计数器,并等待它的死亡.孩子们做了以下事情.

第一个孩子(读者):

  1. 打开文件,
  2. 读一条线,
  3. 向第二个孩子发送信号(SIGUSR1),
  4. 等待第二个孩子的信号,
  5. 如果我们可以读另一行,请转到2,否则杀死第二个孩子.

第二个孩子(柜台):

  1. 等待读者的信号(SIGUSR1),
  2. 计算线长,
  3. 向读者发送信号并转到1.

我等待来自另一个进程的信号时遇到麻烦.在调用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)

c linux signals sigprocmask ipc

0
推荐指数
1
解决办法
228
查看次数

标签 统计

c ×4

sigprocmask ×4

signals ×3

ipc ×1

language-lawyer ×1

linux ×1

macos ×1

posix ×1

sigaction ×1

unix ×1