2

我想从我的 C++ 代码运行另一个程序。system()返回 int,因为每个程序只能将 int 返回给操作系统。但是,我要调用的另一个程序将在我的基本应用程序中生成我需要的字符串。如何将其发送到父进程?

这两个应用程序将在同一个文件夹中,所以我认为子应用程序可以将字符串保存到“temp.txt”,然后主应用程序可能会读取并删除它(这不是性能关键过程,我将调用另一个进程只是在我的主 opengl 应用程序中调用打开文件对话框)。然而这有点丑陋的解决方案,有更好的跨平台解决方案吗?

谢谢

4

3 回答 3

5

您可以使用popen(),这将打开一个您可以写入和读取数据的进程。AFIK 这也是跨平台的

// crt_popen.c
/* This program uses _popen and _pclose to receive a 
 * stream of text from a system process.
 */
#include <stdio.h>
#include <stdlib.h>

int main(void) {

   char   psBuffer[128];
   FILE   *pPipe;

        /* Run DIR so that it writes its output to a pipe. Open this
         * pipe with read text attribute so that we can read it 
         * like a text file. 
         */

   if((pPipe = _popen("dir *.c /on /p", "rt")) == NULL)
      exit(1);

        /* Read pipe until end of file. */

   while(!feof(pPipe)) {
      if(fgets(psBuffer, 128, pPipe) != NULL)
         printf(psBuffer);
   }

        /* Close pipe and print return value of pPipe. */

   printf("\nProcess returned %d\n", _pclose(pPipe));

   return 0;
}
于 2012-12-20T18:23:30.537 回答
4

尽管它不是 C++ 标准的一部分,但几乎所有当前合理的系统都提供了一个popen(或者_popen,在 Microsoft 的情况下),它可以让您生成一个子进程并从其标准输出中读取作为FILE *父级中的 C 样式。至少如果内存服务,popen包含在 POSIX 中,因此您可以期望它存在于基本上所有类 Unix 系统中(并且,如上所述,它也可以在 Windows 上使用,至少在大多数编译器中)。

换句话说,您可能遇到的唯一不可用的地方是小型嵌入式系统,它可能毫无意义(例如,没有文件系统可以在其中找到其他可执行文件,并且很可能没有能力也可以创建新进程)。

于 2012-12-20T18:23:37.677 回答
2

尽管没有实现进程间通信的标准方法,但有一个相对无痛的库,可移植到许多操作系统/编译器:Boost.Interprocess。它涵盖了大多数必需品:

  • 共享内存。
  • 内存映射文件。
  • 信号量、互斥体、条件变量和可升级互斥体类型,以将它们放置在共享内存和内存映射文件中。
  • 这些同步对象的命名版本,类似于 UNIX/Windows sem_open/CreateSemaphore API。
  • 文件锁定。
  • 相对指针。
  • 消息队列。
于 2012-12-20T18:38:52.493 回答