2

我需要编写一个简单的函数,它在 linux 中执行以下操作:

  • 创建两个进程。
  • 让Process1中的thread1做一些小操作,操作完成后通过thread2向Process2发送消息。*Process2 应确认收到的消息。

我不知道从哪里开始

  1. 我已经编写了两个简单的函数,它们只是在一个循环中从 0 计数到 1000(循环在一个线程调用的函数中运行),我已经编译了它们以获取二进制文件。
  2. 我从一个shell脚本一个接一个地执行这些(都在后台运行)
  3. 一旦 process1 在其循环中达到 1000,我希望第一个进程向另一个进程发送“完成”消息。

我不确定我的方法在流程方面是否正确,我完全不知道如何在这两者之间进行沟通。任何帮助将不胜感激。

迷失在太空

4

3 回答 3

2

您可能希望为此使用管道。根据进程的启动方式,您需要命名管道或匿名管道:

  • man mkfifo如果进程彼此独立启动,请使用命名管道(又名 fifo, )。
  • man 2 pipe如果进程是由父进程通过分叉启动的,则使用匿名管道 ( )。父进程将创建管道,子进程将继承它们。这可能是“最漂亮”的解决方案。

在这两种情况下,管道的端点都像任何其他文件描述符一样使用(但更像是套接字而不是文件)。

如果您还不熟悉管道,我建议您阅读 Marc Rochkind 的《高级 UNIX 编程》一书,其中详细解释了这些技术并且易于理解的示例代码。那本书还介绍了其他进程间通信方法(在 POSIX 系统上唯一真正有用的进程间通信方法是共享内存,但只是为了乐趣/完整性,他提出了一些技巧)。

于 2013-05-22T10:52:08.777 回答
2

由于您创建了流程(我假设您正在使用fork()),您可能需要查看eventfd().

eventfd()'s 提供了一种轻量级的机制,可以将事件从一个进程或线程发送到另一个进程或线程。更多关于eventfd()s 的信息和一个小例子可以在这里找到http://man7.org/linux/man-pages/man2/eventfd.2.html

于 2013-05-22T10:56:56.293 回答
1

如果您只是在寻找一个简单的解决方案,信号或命名管道(因为您分别启动两个进程)可能是这里的方法。对于信号,您的客户端进程(发送“完成”的那个)将需要知道服务器的进程 ID,对于命名管道,它们都需要知道管道文件的位置以进行通信。

但是,我想指出一个简洁的 IPC/网络工具,如果您正在设计一个更大、更健壮的系统,它可以让您的工作更轻松:0MQ可以使这种客户端/服务器交互变得非常简单,并允许您以您喜欢的任何顺序启动程序(如果您正确构建代码)。我强烈推荐它。

于 2013-05-22T17:58:54.240 回答