如何在C++;并与it进行跨平台沟通 我想从C++代码中运行另一个程序。code>system()返回int,因为每个程序只能向操作系统返回int。但是,我想调用的另一个程序将生成我在基本应用程序中需要的字符串。如何将其发送到父进程
这两个应用程序将在同一个文件夹中,因此我认为子应用程序可以将字符串保存到“temp.txt”,然后主应用程序可以读取并删除它(这不是性能关键的过程,我将调用另一个过程,只是调用我的主opengl应用程序中的“打开文件”对话框)。然而,这是一个有点丑陋的解决方案,有更好的跨平台解决方案吗 感谢您可以使用,这将打开一个可以写入和读取数据的过程。AFIK这也是跨平台的如何在C++;并与it进行跨平台沟通 我想从C++代码中运行另一个程序。code>system()返回int,因为每个程序只能向操作系统返回int。但是,我想调用的另一个程序将生成我在基本应用程序中需要的字符串。如何将其发送到父进程,c++,linux,windows,cross-platform,process,C++,Linux,Windows,Cross Platform,Process,这两个应用程序将在同一个文件夹中,因此我认为子应用程序可以将字符串保存到“temp.txt”,然后主应用程序可以读取并删除它(这不是性能关键的过程,我将调用另一个过程,只是调用我的主opengl应用程序中的“打开文件”对话框)。然而,这是一个有点丑陋的解决方案,有更好的跨平台解决方案吗 感谢您可以使用,这将打开一个可以写入和读取数据的过程。AFIK这也是跨平台的 // crt_popen.c /* This program uses _popen and _pclose to receive a
// 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;
}
//crt\u popen.c
/*此程序使用_popen和_pclose接收
*来自系统进程的文本流。
*/
#包括
#包括
内部主(空){
字符psBuffer[128];
文件*pPipe;
/*运行DIR,使其将输出写入管道。打开此
*具有“读取文本”属性的管道,以便我们可以读取它
*就像一个文本文件。
*/
if((pPipe=_popen(“dir*.c/on/p”,“rt”))==NULL)
出口(1);
/*读取管道直到文件结束*/
而(!feof(pPipe)){
if(fgets(psBuffer,128,pPipe)!=NULL)
printf(psBuffer);
}
/*关闭管道并打印管道的返回值*/
printf(“\n进程返回%d\n”,\u pclose(pPipe));
返回0;
}
虽然它不是C++标准的一部分,但几乎所有合理的当前系统都提供了<代码> POPON <代码>(或PopeN<代码>,在微软的情况下),它将允许您生成子进程并从其标准输出中读取作为父样式的C样式<代码>文件> /COD>。至少在内存可用的情况下,popen
包含在POSIX中,因此您可以预期它基本上出现在所有类似Unix的系统中(如上所述,它也可以在Windows上使用,至少在大多数编译器中是这样)
换句话说,您可能遇到的唯一不可用的地方是类似于小型嵌入式系统的东西,在那里它可能毫无意义(例如,找不到其他可执行文件的文件系统,也很可能无法创建新进程).虽然没有实现进程间通信的标准方法,但有一个相对轻松的库,可移植到许多操作系统/编译器:。它涵盖了大多数必需品:
- 共享内存李>
- 内存映射文件李>
- 信号量、互斥量、条件变量和可升级互斥量
类型将它们放置在共享内存和内存映射文件中
- 这些同步对象的命名版本,类似于
UNIX/Windows sem\u打开/创建信号量API
- 文件锁定
- 相对指针李>
- 消息队列
使用数据库、共享内存、文件或网络连接。这是两个进程之间通信的一些标准方式。你能解释一下共享内存吗?这里有一个链接,你可以通过谷歌搜索找到更多关于进程间通信的信息,简称IPC。我不知道选择哪一种,两者都很好。我会检查你的答案,但另一个也很好。