将数据发送到另一个 C++ 程序

Posted

技术标签:

【中文标题】将数据发送到另一个 C++ 程序【英文标题】:Send data to another C++ program 【发布时间】:2012-06-25 19:54:57 【问题描述】:

是否可以,不能修改另一个程序(因为有些人似乎忽略了这个重要的限制)?如果是这样,你会怎么做?我当前的方法包括创建一个临时文件并以文件名作为参数启动另一个程序。唯一的问题是这会留下一堆临时文件以供以后清理,这是不希望的。

编辑:另外,提升不是选项。

【问题讨论】:

其他程序可以使用stdin作为输入文件吗?如果是这样,您可能只是管道它。 您是否阅读过您系统上可用的各种IPC 机制? @FredLarson 我不这么认为。我相信它将文件名作为启动参数。 你写的是什么操作系统? @Robᵩ 最好是跨平台,但要从 Linux 开始。 【参考方案1】:

显然,如果第二个程序支持它,那么构建一个到 stdin 的管道是可行的方法。正如 Fred 在评论中提到的,如果没有提供命名文件,或者使用 - 作为文件名,许多程序都会读取 stdin。

如果它必须采用文件名,并且您使用的是 Linux,那么试试这个:创建一个管道,并在命令行上传递 /dev/fd/<fd-number>/proc/self/fd/<fd-number>

例如,这里是 hello-world 2.0:

#include <string>
#include <sstream>
#include <cstdlib>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main () 

  int pfd[2];
  int rc;

  if( pipe(pfd) < 0 ) 
    perror("pipe");
    return 1;
  

  switch(fork()) 
  case -1: // Error
    perror("fork");
    return 1;

  case 0:  // Child
    // Close the writing end of the pipe
    close(pfd[1]);

    // Create a filename that refers to reading end of pipe
    std::ostringstream path;
    path << "/proc/self/fd/" << pfd[0];

    // Invoke the subject program. "cat" will do nicely.
    execlp("/bin/cat", "cat", path.str().c_str(), (char*)0);

    // If we got here, then something went wrong, then execlp failed
    perror("exec");
    return 1;
  

  default: // Parent
    // Close the reading end.
    close(pfd[0]);

    // Write to the pipe. Since "cat" is on the other end, expect to
    // see "Hello, world" on your screen.
    if (write(pfd[1], "Hello, world\n", 13) != 13)
      perror("write");

    // Signal "cat" that we are done writing
    close(pfd[1]);

    // Wait for "cat" to finish its business
    if( wait(0) < 0)
      perror("wait");

    // Everything's okay
    return 0;
  

【讨论】:

你能举一个后者的例子吗?【参考方案2】:

您可以使用套接字。听起来这两个应用程序都在同一主机上,因此您只需将对等方标识为 localhost:portA 和 localhost:port B。如果您这样做,您最终可以毕业做网络 IO。没有临时文件,没有神秘的解析错误或文件删除。 TCP 保证数据包的传递并保证它们将被正确排序。

是的,我会考虑创建一个同步套接字服务器(如果您预计有大量对等点,请使用异步)。与面向管道的 IPC 相比,一个好处是 TCP 套接字是完全通用的。管道根据您所在的系统而有很大差异(考虑 Windows 命名管道与隐式和显式 POSIX 管道 -> 非常不同)。

【讨论】:

为什么我感觉这需要修改二级程序? 确实如此。我假设您可以控制这两个来源,不是吗? 无法修改其他程序不,我没有。 听起来困扰您的只是剩下一堆临时文件。这个问题很容易用 3 或 4 行的 shell 脚本解决,别无其他。第 0 行:#!/bin/bash。第 1 行:T=`mktemp temp.XXXXX.file`。第 2 行:./secondProgram -p "$T"。第 3 行: rm -f "$T" 。该脚本完全符合您的要求,之后不会留下任何临时文件。无需额外编码。 或者,第 1a 行:trap "rm -f $T" 0 而不是第 3 行。

以上是关于将数据发送到另一个 C++ 程序的主要内容,如果未能解决你的问题,请参考以下文章

Android 将数据从一个应用程序发送到另一个应用程序

我们如何在 UI 线程中创建处理程序以将数据发送到另一个线程

如何将数据从一个 Fragment 发送到另一个 Fragment?

利用消息将一个进程的数据发送到另一个进程(Linux)

使用 Prebuilt UITabBarController 将数据发送到另一个视图?

c# 将键盘命令发送到另一个窗口/进程