问题标签 [sigprocmask]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1161 浏览

c - sigprocmask 不会恢复我的信号处理程序

我的代码 C Unix 有问题。我将复制关键部分:因此,在第一个 sigprocmask 之后,我发送了一个信号,在 SIG_UNBLOCK 之后,之前的句柄(gestisciSignalDopoReg)不起作用,而是标准句柄管理我的信号,所以它只是终止进程......出了什么问题? 谢谢

请!我需要帮助!

0 投票
1 回答
1653 浏览

unix - sigset_t unix 使用 sigprocmask()

我正在尝试使用 printf 打印 sigset。在这个程序中,我使用了 sigprocmask 来阻止 SIGHUP 和 SIGTERM。在将 set 和 oset 初始化为空集后,它们会给出一些随机的十六进制字符串作为输出。我该怎么解决这个问题??

另外,如果我在执行后按 Ctrl-C,我对该程序的预期输出有疑问。catcher 函数是否也继承了当前的信号集并且应该与 set 一样打印?

0 投票
1 回答
391 浏览

c - Sequential signals between two processes

I have a parent process and two children. The parent process only creates two children, a reader and a counter, and waits for its death. The children do the following things.

The first child (reader):

  1. opens file,
  2. reads a line,
  3. sends a signal (SIGUSR1) to the second child,
  4. waits for a signal from the second child,
  5. go to 2 if we can read another line, else kill the second child.

The second child (counter):

  1. waits for a signal (SIGUSR1) from reader,
  2. counts line length,
  3. sends a signal to reader and go to 1.

I have trouble waiting for a signal from another process. The signal can be received before I call pause() function, i.e., process can be blocked forever. I also tried to use sigprocmask(), sigsuspend() and sigwaitinfo(), but it doesn't work correctly.

For this code I can get the following sequence:

Why counter doesn't write "got signal"? How I can send and receive signals synchronously? (I know about other IPC methods, but I need synchronization through signals.)

0 投票
1 回答
350 浏览

c - 阻塞信号的行为是什么?

如果我向一个进程发送一堆 SIGIO 信号并且该进程阻止 SIGIO 信号并执行其他操作。当我解除阻塞信号时,会只有一个 SIGIO 信号还是依次有多个 SIGIO 信号?

0 投票
1 回答
622 浏览

linux - sigtimedwait() 的“set”参数中的信号未传递

我最近一直在研究 Linux 上的信号处理,并阅读了与信号处理相关的所有概念。一个让我头疼的问题是,为什么 sigtimedwait() 集合中的信号在进程畅通时没有得到传递。我的代码如下: -

为了更清楚地说明这个问题,我在上面的代码中调用了 sigtimedwait,并将“s1”作为“set”参数。该集合仅包含信号 SIGINT。根据手册页, sigtimedwait() 会阻止进程,直到传递其集合中的一个信号。我对这个说法没意见。但是为什么当我通过 SIGINT 来解锁进程时没有调用 SIGINT 处理程序?另一方面,当我传递集合中不存在的 SIGALRM 或 SIGTSTP 时,EINTR 按预期返回,并且信号处理程序也被调用。

对于任何想观察场景的人,都可以执行上述代码,然后将 SIGINT 传递给它。他们将观察到进程在没有调用处理程序的情况下被解除阻塞。为什么不调用处理程序?我是否误解了sigtimedwait()手册页的任何部分?

0 投票
1 回答
341 浏览

signals - sigprocmask 后的信号传递

我的印象是,使用sigprocmask()解除阻塞信号会导致待处理的阻塞信号被传递给处理。

sigprocmask()在用于解除阻塞信号的特定情况下,如果存在SIGUSR1已解除阻塞的挂起信号(例如 ),是否会通过调用解除阻塞不同信号SIGUSR1的调用将信号传递给进程,sigprocmask()同时保持SIGUSR1解除阻塞?

0 投票
0 回答
743 浏览

c - 带有 SIG_BLOCK 的 sigprocmask 不会阻止 SIGALRM

它是一个示例程序,用于检查 sigprocmask 是否真的阻塞了与我的计时器相关的 SIGALRM 信号。事实证明不是。即使信号被阻塞,我的处理程序也会被调用。如果有人能指出为什么会这样,我将不胜感激。这是代码:

0 投票
1 回答
49 浏览

c - 这里使用信号的方式背后的想法是什么?

在阅读和学习信号时,我发现了一个以特定方式使用信号的程序。我试着理解它,但我不确定代码的所有部分如何与另一个部分交互。

下面是上面提到的代码,我添加了注释,我遇到了困难:

显然,上述程序旨在让最多 42 个子进程在工作。每当我们想要一个新的子进程时,我们都会使用 fork 和 adjust curprocs。每当子进程完成时,都会调用 chldhandler() 并curprocs进行调整。

但是我不明白两者sigproc_mask, sigsuspend, waitpid和我们两个的相互作用signalsets chld, empty

有人可以解释这些行的作用或为什么要这样使用它们吗?

0 投票
1 回答
999 浏览

c - 子进程是否也应该解除阻塞的 SIGCHLD 信号?

我正在尝试了解阻塞和解除阻塞信号的工作原理,并且我正在尝试理解以下代码。具体来说,我正在查看第 28 行(在代码中注释)int a = sigprocmask(SIG_UNBLOCK, &mask, NULL);:,也就是信号在孩子中畅通的地方。

我从中得到代码的教科书说代码使用信号阻塞来确保程序printf("adding %d\n", pid);在其删除功能(简化为)之前执行其添加功能(简化为printf("deleting %d\n", pid);)。这对我来说很有意义;通过阻塞SIGCHLD信号,然后在执行 add 函数后解除阻塞,我们确保在执行 add 函数之前不会调用处理程序。但是,我们为什么要解锁孩子的信号呢?这不是通过立即解除阻塞来消除阻塞的全部意义,允许孩子在父添加之前删除吗?

但是,无论我是否注释掉了该行,输出(在代码之后描述)都是相同的,这意味着这显然不是发生的事情。教科书说:

SIGCHLD“注意孩子继承了父母的屏蔽集,所以在调用之前我们必须小心解锁孩子的信号execve。”

但在我看来,解除阻塞仍会导致调用处理程序。这条线具体是做什么的?

输出:

0 投票
1 回答
92 浏览

c - sigprocmask 后 sigset_t 的值

来自man sigprocmask

“如果 oset 不为空,则将其设置为信号掩码的先前值。”

我的问题:没有运行或调试程序,

  1. 执行第 10 行后,旧信号掩码的值存储到y. 由于在执行此行之前没有阻塞信号,所以 的值是y多少?

  2. 有没有办法确定z执行第 14 行后的值?