问题标签 [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.
c - sigprocmask 不会恢复我的信号处理程序
我的代码 C Unix 有问题。我将复制关键部分:因此,在第一个 sigprocmask 之后,我发送了一个信号,在 SIG_UNBLOCK 之后,之前的句柄(gestisciSignalDopoReg)不起作用,而是标准句柄管理我的信号,所以它只是终止进程......出了什么问题? 谢谢
请!我需要帮助!
unix - sigset_t unix 使用 sigprocmask()
我正在尝试使用 printf 打印 sigset。在这个程序中,我使用了 sigprocmask 来阻止 SIGHUP 和 SIGTERM。在将 set 和 oset 初始化为空集后,它们会给出一些随机的十六进制字符串作为输出。我该怎么解决这个问题??
另外,如果我在执行后按 Ctrl-C,我对该程序的预期输出有疑问。catcher 函数是否也继承了当前的信号集并且应该与 set 一样打印?
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):
- opens file,
- reads a line,
- sends a signal (SIGUSR1) to the second child,
- waits for a signal from the second child,
- go to 2 if we can read another line, else kill the second child.
The second child (counter):
- waits for a signal (SIGUSR1) from reader,
- counts line length,
- 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.)
c - 阻塞信号的行为是什么?
如果我向一个进程发送一堆 SIGIO 信号并且该进程阻止 SIGIO 信号并执行其他操作。当我解除阻塞信号时,会只有一个 SIGIO 信号还是依次有多个 SIGIO 信号?
linux - sigtimedwait() 的“set”参数中的信号未传递
我最近一直在研究 Linux 上的信号处理,并阅读了与信号处理相关的所有概念。一个让我头疼的问题是,为什么 sigtimedwait() 集合中的信号在进程畅通时没有得到传递。我的代码如下: -
为了更清楚地说明这个问题,我在上面的代码中调用了 sigtimedwait,并将“s1”作为“set”参数。该集合仅包含信号 SIGINT。根据手册页, sigtimedwait() 会阻止进程,直到传递其集合中的一个信号。我对这个说法没意见。但是为什么当我通过 SIGINT 来解锁进程时没有调用 SIGINT 处理程序?另一方面,当我传递集合中不存在的 SIGALRM 或 SIGTSTP 时,EINTR 按预期返回,并且信号处理程序也被调用。
对于任何想观察场景的人,都可以执行上述代码,然后将 SIGINT 传递给它。他们将观察到进程在没有调用处理程序的情况下被解除阻塞。为什么不调用处理程序?我是否误解了sigtimedwait()手册页的任何部分?
signals - sigprocmask 后的信号传递
我的印象是,使用sigprocmask()
解除阻塞信号会导致待处理的阻塞信号被传递给处理。
sigprocmask()
在用于解除阻塞信号的特定情况下,如果存在SIGUSR1
已解除阻塞的挂起信号(例如 ),是否会通过调用解除阻塞不同信号SIGUSR1
的调用将信号传递给进程,sigprocmask()
同时保持SIGUSR1
解除阻塞?
c - 带有 SIG_BLOCK 的 sigprocmask 不会阻止 SIGALRM
它是一个示例程序,用于检查 sigprocmask 是否真的阻塞了与我的计时器相关的 SIGALRM 信号。事实证明不是。即使信号被阻塞,我的处理程序也会被调用。如果有人能指出为什么会这样,我将不胜感激。这是代码:
c - 这里使用信号的方式背后的想法是什么?
在阅读和学习信号时,我发现了一个以特定方式使用信号的程序。我试着理解它,但我不确定代码的所有部分如何与另一个部分交互。
下面是上面提到的代码,我添加了注释,我遇到了困难:
显然,上述程序旨在让最多 42 个子进程在工作。每当我们想要一个新的子进程时,我们都会使用 fork 和 adjust curprocs
。每当子进程完成时,都会调用 chldhandler() 并curprocs
进行调整。
但是我不明白两者sigproc_mask, sigsuspend, waitpid
和我们两个的相互作用signalsets chld, empty
。
有人可以解释这些行的作用或为什么要这样使用它们吗?
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
。”
但在我看来,解除阻塞仍会导致调用处理程序。这条线具体是做什么的?
输出:
c - sigprocmask 后 sigset_t 的值
来自man sigprocmask
:
“如果 oset 不为空,则将其设置为信号掩码的先前值。”
我的问题:没有运行或调试程序,
执行第 10 行后,旧信号掩码的值存储到
y
. 由于在执行此行之前没有阻塞信号,所以 的值是y
多少?有没有办法确定
z
执行第 14 行后的值?