c - 哪种方法更适合在 c 中的两个进程之间进行对话?

标签 c linux

<分区>

我有两个不同的应用程序。我必须从 application_2 通知 application_1 application_1 必须执行一些操作。(应该调用一个函数)。

  1. 我可以在 application_2 的文本文件中写入一些消息“take_action”,application_1 会定期检查该文本文件中的“take_action”。在获取“take_action”后,它将调用相应的函数并将“action_taken”写入文本文件。
  2. 我可以使用管道或共享内存来代替文件。
  3. 我可以通过终止命令 (kill -SIGHUP) 传递来自 application_2 的信号,并在 SIGHUP 信号到达 application_1 时调用所需的函数。

方法一和方法三的示例代码如下。

方法_1:

在 application_2 中:

    fprintf(fp, "take_action");

在 application_1 中:

    int rd = read(filedReading, lineText, 13);
    if (strcmp(lineText, "take_action") == 0)
    {
    reloadRule(); //calling required function
    }

方法_3:

在 application_2 中:

    system("kill -SIGHUP");

在 application_1 中:

    void sig_handler(int signo)
    {
    switch(signo) {
    case SIGUSR1:
    opt_debug = opt_debug ? 0 : 1;
    break;
    case SIGHUP:
    log_msg(LOG_NOTICE, "SIGHUP SIGNAL RECEIVED");
    reloadRule(); //calling required function
    default:
    cleanexit(0);
    }

哪种方法最适合解决此类问题?

最佳答案

一如既往的意见:

如果只涉及一台机器,临时文件几乎总是错误的做法,如果需要多台机器协作,则存在 RPC 方法。

当很容易建立句柄时,匿名管道工作得很好。您可以使用 socketpair 和 mkfifo 将管道模型扩展到更广泛的场景。

当管道带宽成为问题时,共享内存是前进的方向。您可以通过管道获取大量数据,但它仍然涉及内存的多个副本。设置共享内存池是一件痛苦的事情,但它使两个进程(几乎)可以直接访问约定的共享内存区域,这对于数据传输来说非常快。当然,您必须进行此设置并且存在潜在的同步问题,但您可以使用管道轻松建立连接或以低得多的带宽同步内存池。

信号非常有限。您只能轻松发送一个标志,它们都有存在的理由,当“R”决定使用 USR1 和 USR2 进行内存管理时会发生什么,因此您不能将您的代码用于“R”程序等?当然,消息队列将信号扩展为具有较小的负载。

关于c - 哪种方法更适合在 c 中的两个进程之间进行对话?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58381898/

相关文章:

java.security.AccessControlException :access denied ("java.io.FilePermission" "File path" "write" )

linux - 修剪 bash/sed 中的输入

regex - txt文件删除url到最后 "/"得到文件

python - 使用 Python 程序写入和读取 cmd 提示符

c - #include 实际上做了什么?

C 冒泡排序整数数组 - 输出问题

c - 我正在尝试将字符 int 转换为整数 int。在 C

c - 什么是 "null pointer assignment error"?

带有段错误的客户端服务器代码

linux - Fedora arm - Orange Pi plus 2e