zhangjinxuan 发表于 2024-11-14 14:04:16

Linux 如何让两个可执行文件交互

假设有两个可执行文件 a,b,我需要同时运行两个程序,使得 a 的输入从 b 的输出内容中读入, b 的输入从 a 的输出内容中读入。

zhangjinxuan 发表于 2024-11-14 14:07:24

@Fishc

Linux 如何让两个可执行文件交互

假设有两个可执行文件 a,b,我需要同时运行两个程序,使得 a 的输入从 b 的输出内容中读入, b 的输入从 a 的输出内容中读入。

FishC 发表于 2024-11-14 14:10:59

要实现两个可执行文件之间的交互,可以使用管道(pipe)来连接它们的输入和输出。在 Linux 中,可以使用命令行工具 `mkfifo` 创建命名管道,并通过它们进行交互。以下是一个简单的步骤示例:

1. **创建命名管道:**

   你需要两个命名管道,分别用于两个程序之间的输入输出。

   mkfifo pipe_a_to_b
   mkfifo pipe_b_to_a

2. **运行程序并连接管道:**

   使用命名管道连接两个程序的 I/O。可以在多个终端中执行以下命令:

   - 在第一个终端中运行程序 `a`,让其从 `pipe_b_to_a` 读取输入并将输出写入 `pipe_a_to_b`:

   ./a < pipe_b_to_a > pipe_a_to_b

   - 在第二个终端中运行程序 `b`,让其从 `pipe_a_to_b` 读取输入并将输出写入 `pipe_b_to_a`:

   ./b < pipe_a_to_b > pipe_b_to_a

3. **确保进程缓存**:

   如果程序的输出可能被缓存,可以考虑关闭行缓冲或者设置无缓冲,以确保及时交互:

   - 对于 C/C++ 程序,使用 `setvbuf(stdout, NULL, _IONBF, 0);` 或者使用 `fflush(stdout);` 。
   - 对于 Python 等其他语言,运行程序时可以添加参数(如 `python -u script.py`)来禁用缓冲。

这样,程序 `a` 和 `b` 将通过管道进行实时的输入输出交换,实现交互。这种方法依赖于程序的设计支持标准输入输出的流式交互。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

FishC 发表于 2024-11-14 14:13:55

zhangjinxuan 发表于 2024-11-14 14:07
@Fishc

Linux 如何让两个可执行文件交互

假设有 ...

要让两个可执行文件 `a` 和 `b` 进行交互,你可以使用 Linux 的管道(pipe)和过程替换(process substitution)功能来实现。下面是一个常见的方法:

1. **命令管道和过程替换**:

你可以使用命令管道和过程替换结合 `mkfifo`(创建命名管道)来实现两个程序的相互输出来回重定向。

# 创建两个命名管道
mkfifo pipe_a_to_b
mkfifo pipe_b_to_a

# 运行两个程序并使它们通过管道进行通信
# 从 pipe_b_to_a 读取数据作为 a 的输入管道,将 a 的输出重定向到 pipe_a_to_b
# 从 pipe_a_to_b 读取数据作为 b 的输入管道,将 b 的输出重定向到 pipe_b_to_a
./a < pipe_b_to_a > pipe_a_to_b &
./b < pipe_a_to_b > pipe_b_to_a &

2. **注意事项**:

- 可以通过 `&` 子程序运行在后台,确保两个程序可以同时执行。
- 确保两个程序都能够处理来自标准输入输出的流数据。
- 不要忘记在结束时删除命名管道以清理由命令创建的文件:
rm pipe_a_to_b pipe_b_to_a

通过这种方式,你可以实现两个程序 `a` 和 `b` 之间的输入输出交互。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

zhangjinxuan 发表于 2024-11-14 14:34:31

FishC 发表于 2024-11-14 14:13
要让两个可执行文件 `a` 和 `b` 进行交互,你可以使用 Linux 的管道(pipe)和过程替换(process subst ...

windows 有类似的东西吗

FishC 发表于 2024-11-14 14:35:44

zhangjinxuan 发表于 2024-11-14 14:34
windows 有类似的东西吗

在 Windows 中,可以使用匿名管道或命名管道来实现类似于 Linux 中通过命名管道进行进程间通信的功能。

### 使用命名管道

Windows 提供了命名管道,可以在不同进程之间进行通信,支持本地计算机和网络间通信。下面是个简要的描述如何在 Windows 中实现类似的功能:

1. **创建命名管道**:可以使用 Windows API 创建命名管道。例如,可以在一个程序中创建一个服务端(服务器端命名管道),然后在另一个程序中连接这个命名管道作为客户端。

2. **使用编程语言**:如果你使用的是 C/C++,可以使用 Windows API 函数 `CreateNamedPipe` 和 `ConnectNamedPipe` 来创建和连接命名管道。

3. **PowerShell 或其他工具**:某些脚本语言或工具(如 PowerShell 和 .NET)也提供了对命名管道的支持,可能会更方便一些。

### 匿名管道

如果这两个程序都是你编写的,并且由同一个父进程启动,可以使用匿名管道。这种方法主要用于父子进程间的通信。

1. **创建匿名管道**:可以在父进程中创建匿名管道,使用 `CreatePipe` 函数。
2. **子进程继承句柄**:通过 `STARTUPINFO` 结构体中的 `hStdInput` 和 `hStdOutput` 成员,使子进程的标准输入输出与匿名管道连接。

### 示例

要在命令行工具之间快速模拟这样的行为,可以使用一个中介程序或脚本去实现这种双向通信,但这通常需要编写一些代码,具体实现取决于你的程序和使用的技术栈。

如果你对具体的代码实现有兴趣,可以查看 Windows API 文档,或使用其他编程语言(如 Python 的 `subprocess` 和 `multiprocessing` 库或 .NET 的命名管道 API)来实现更高层次的封装和应用开发。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: Linux 如何让两个可执行文件交互