【发布时间】:2021-04-15 15:58:42
【问题描述】:
我正在尝试解决我在 C 项目中遇到的一个问题,其中两个进程 A 和 B 进行通信。 进程 B 使用 bash 接收来自用户的信号,并将该信号发送给进程 A。 进程 A 必须忽略来自用户的任何信号,但只能从进程 B 接收信号。 问题是: 是否可以仅使用信号编写此通信,还是必须使用其他数据结构(例如套接字)才能实现?
【问题讨论】:
我正在尝试解决我在 C 项目中遇到的一个问题,其中两个进程 A 和 B 进行通信。 进程 B 使用 bash 接收来自用户的信号,并将该信号发送给进程 A。 进程 A 必须忽略来自用户的任何信号,但只能从进程 B 接收信号。 问题是: 是否可以仅使用信号编写此通信,还是必须使用其他数据结构(例如套接字)才能实现?
【问题讨论】:
是的,这可以通过标准 UNIX 信号实现,它具有发送者的概念,因此您的应用程序可以检查谁生成了信号。
如果进程 A 知道进程 B 的 PID,它可以将其信号处理程序注册到 sigaction() and SA_SIGINFO。然后,在传递或接受信号时,进程 A 可以检查传递给处理程序的 the siginfo_t structure 的 si_code 和 si_pid 成员。如果不是来自 B,则不采取任何行动。
类似:
static pid_t pid_of_B;
....
static void
my_handler(int sig_num, siginfo_t *si, void *ignored) {
switch (si->si_code) {
case SI_USER: // sent via kill
case SI_QUEUE: // sent via sigqueue
if (si->si_pid == pid_of_B) ... // sent from B?
...
}
}
【讨论】:
不,这对于信号是不可能的。信号必须具有“发送者”的概念,因此应用程序无法检查是谁生成了信号。
但是您可以使用管道在两个进程之间传递数据。
【讨论】: