首页 > 解决方案 > 哪种方法更适合在 c 中的两个进程之间进行对话?

问题描述

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

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

方法 1 和 3 的示例代码如下。

方法_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);
    }

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

标签: clinux

解决方案


一如既往的观点:

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

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

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

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


推荐阅读