c - 哪种方法更适合在 c 中的两个进程之间进行对话?
问题描述
我有两个不同的应用程序。我必须从 application_2 通知 application_1,application_1 必须执行一些操作。(应该调用一个函数)。
- 我可以在 application_2 的文本文件中写入一些消息“take_action”,application_1 将定期检查该文本文件中的“take_action”。获取“take_action”后,它将调用相应的函数并将“action_taken”写入文本文件.
- 我可以使用管道或共享内存而不是文件。
- 我可以通过 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);
}
哪种方法最适合此类问题?
解决方案
一如既往的观点:
如果只涉及一台机器,则临时文件几乎总是错误的做法,如果您需要多台机器协作,则存在 RPC 方法。
当很容易建立句柄时,匿名管道就可以很好地工作。您可以使用 socketpair 和 mkfifo 将管道模型扩展到更广泛的场景。
当管道带宽成为问题时,共享内存是前进的方向。您可以通过管道获取大量数据,但仍涉及大量内存副本。设置共享内存池很痛苦,但它让两个进程(几乎)可以直接访问约定的共享内存区域,这对于数据传输来说非常快。当然,您必须进行此设置,并且存在潜在的同步问题,但您可以使用管道轻松建立连接或以低得多的带宽同步内存池。
信号非常有限。您只能轻松发送一个标志,它们都已经有存在的理由,以及当“R”决定使用 USR1 和 USR2 进行内存管理时会发生什么,因此您不能将代码与“R”程序等一起使用? 当然,消息队列将信号扩展为具有较小的有效负载。
推荐阅读
- javascript - 在 reactjs 中渲染组件时动态加载图像路径。错误:找不到模块
- c# - 如何在堆中分配值类型数组?
- python - EB CLI 使用 Python 2 而不是 Python 3 安装
- php - if(mysqli_num_rows) while(mysqli_fetch_assoc) 循环在第一次迭代时未发布正确的值,适用于下一次迭代
- javascript - 如何自定义离子选择和离子选项菜单(离子)
- python - Python 在多行字符串中替换
- html - 使用 css 在视图中移动元素
- php - PHP Coinbase 如何使用 PHP 语言开始使用这个 API?
- excel - 访问 VBA“记录太大”
- java - Java 通过自定义 JCheckBoxList 使用制表键进行导航