c - IPC 在 Linux 上使用 Signals

标签 c linux signals ipc

可以使用信号捕获和信号提升来执行IPC(进程间通信)吗?

我制作了两个程序。在第一个程序中我处理了信号,在另一个程序中我只是提出了我想在另一个程序中处理的信号。我对我来说工作得很好,但我想使用信号在这两个程序之间进行通信,并且还想用这个 raise 信号发送一些字节的数据。我该怎么做?

我也想用这个信号传递消息。我可以做吗?有可能吗?

此外,使用信号的 IPC 机制的优缺点是什么?

以下是我的两个程序的工作代码。这样一来,我只能发出信号并捕获信号,但我想将数据从一个程序传递到另一个程序。

在第二个程序中,我使用了第一个程序的进程 ID。我怎样才能使它动态。?

第一个程序:

/* Example of using sigaction() to setup a signal handler with 3 arguments
 * including siginfo_t.
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>

static void hdl (int sig, siginfo_t *siginfo, void *context)
{
    printf("sig no = %d \n", sig);
    if(sig == SIGINT)
        exit(0);
    printf ("Sending PID: %ld, UID: %ld\n",
            (long)siginfo->si_pid, (long)siginfo->si_uid);
}

int main (int argc, char *argv[])
{
    struct sigaction act;


    sigemptyset(&act.sa_mask);

    act.sa_sigaction = &hdl;
    act.sa_flags = SA_SIGINFO;

    if (sigaction(SIGUSR1, &act, NULL) < 0) {
        perror ("sigaction SIGUSR1");
        return 1;
    }
    if (sigaction(SIGINT, &act, NULL) < 0) {
        perror ("sigaction SIGINT");
        return 1;
    }

    while (1)
    {
        sleep(1);
    }

    return 0;
}

第二个程序

#include  <stdio.h>
#include  <signal.h>

void  main(void)
{

   while (1)
    {
        sleep(1);
        kill(11558, SIGUSR1);
    }

}

最佳答案

Signals旨在提供对流程的基本控制形式,而不是作为 IPC 机制。信号用作其他任何东西时有几个问题:

  • 很多系统调用都会被一个信号打断,需要特殊处理。

  • 因此,很多实际代码都不是信号安全的。

  • 信号除了自身之外没有任何类型的数据内容。这使得它们作为消息传递方法几乎毫无用处。

  • 在信号处理程序中您只能做这么多。

  • 最重要的是,相同类型的后续信号不会排队 - 它们被合并到一个实例中。

  • 更重要的是,无法保证信号的传递顺序与生成顺序相同。从手册页:

    By contrast, if multiple standard signals are pending for a process, the order in which they are delivered is unspecified.

理论上您可能能够使用多个信号来回设置某种 channel ,其中一些信号的行为类似于某种确认,但任何理智的人都不想尝试这样的事情。您不妨改用烟雾信号...

关于c - IPC 在 Linux 上使用 Signals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11133887/

相关文章:

c++ - 你用##称呼或术语宏是什么

c - 如何通过 libnet 构建并发送 HTTP 302 重定向数据包?

linux - 在 Code::Blocks 中运行构建脚本而不是构建目标

c - 具有 `sigaction()` 的 macOS `SA_SIGINFO` 处理程序不包括 `si_pid`

c - 设计问题: Implementing a two way lookup table in C

c++ - 从这些字符串的图像中提取字符串?

c - 如何通过文件描述符写入数字数组

linux - 使用 vim 复制一个文件的内容并将其插入到另一个文件的特定行中

mips - 在SIGSEGV上显示_Unwind_Backtrace

c++ - 没有匹配的成员函数调用 'connect' - 使用 'this' 时