2

C++ コードから別のプログラムを実行したいと考えています。system()すべてのプログラムは int のみを OS に返すことができるため、int を返します。ただし、呼び出したい他のプログラムは、ベース アプリで必要な文字列を生成します。親プロセスに送信するにはどうすればよいですか?

2つのアプリは同じフォルダーにあるので、子アプリは文字列を「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++ 標準の一部ではありませんが、ほぼすべての妥当な最新のシステムは、子プロセスを生成し、その標準出力から親の C スタイルとして読み取ることができる を提供しますpopen( Microsoft の場合は )。少なくともメモリが機能する場合は、POSIX に含まれているため、本質的にすべての Unix ライクなシステムに存在することが期待できます (また、上記で暗示されているように、少なくともほとんどのコンパイラでは Windows でも利用できます)。_popenFILE *popen

言い換えれば、それが利用できないと遭遇する可能性が高い唯一の場所は、小さな組み込みシステムのようなものです。新しいプロセスを作成します)。

于 2012-12-20T18:23:37.677 に答える
2

プロセス間通信を実現する標準的な方法はありませんが、多くのOS /コンパイラに移植された比較的痛みのないライブラリがあります:Boost.Interprocess。それはほとんどの必需品をカバーしています:

  • 共有メモリ。
  • メモリマップトファイル。
  • セマフォ、ミューテックス、条件変数、およびアップグレード可能なミューテックスタイプを使用して、それらを共有メモリおよびメモリマップトファイルに配置します。
  • UNIX / Windows sem_open / CreateSemaphore APIと同様に、これらの同期オブジェクトの名前付きバージョン。
  • ファイルロック。
  • 相対ポインタ。
  • メッセージキュー。
于 2012-12-20T18:38:52.493 に答える