コンテンツにスキップ

最終更新:2026-10-12

C++ プロセス間通信実践

プロセス間通信は非常に重要なテーマです。特に大規模なプロジェクトにはその姿が見られます。例えば PostgreSQL はパイプを使って copy のプロセス間通信を実現しています。今回の節もこのテーマをもとに、C++ でプロセス間がパイプで通信する demo を構築していきます。この節では、これまでの数節で説明した内容を組み合わせて、比較的完成度の高い実践例を示します:

  • mutex
  • condition_variable
  • thread

注:この節の完全なコードは星球に掲載されます。

まず、非常にシンプルなパイプの使い方として:

  • パイプを作成する

これは creating a pipe, forking, and invoking the shell を行います。

// FILE *popen(const char *command, const char *type);
pipe = popen(command.c_str(), "w");
  • パイプを閉じる
// int pclose(FILE *stream);
pclose(pipe);

あとはそこに書き込みと読み出しをするだけです。原理も非常にシンプルです。例えば:

このとき、data は先ほど作成したパイプに書き込まれます。

// size_t fwrite( const void* buffer, size_t size, size_t count, FILE* stream );
size_t written = fwrite(data.c_str(), sizeof(char), data.size(), pipe);

パイプから読み出す場合は、fread または fgets が使えます。fgets は改行文字を読み込むかバッファサイズに達した時点で停止しますが、fread は指定したバイト数に達するかファイル終端に遭遇するまで、できるだけ多くのデータを読み込みます。同様に、上の fwrite は fputs に置き換えることもできます。

これでパイプの基本的な使い方の紹介は終わりです。完全な demo はどのように書けばよいでしょうか?

簡単です。2 つのスレッドを作成し、一方が書き込み、もう一方が読み出しを担当します。書き込みスレッドは pipe にデータを書き込み、読み出しスレッドは pipe から読み出せばよいのです。

例えば:

std::thread writer_thread(write_to_pipe);
std::thread reader_thread(read_from_pipe);

writer_thread.join();
reader_thread.join();

書き込みスレッドがやるべきことは、fwrite を呼び出してデータを流し込むだけです

ProcessWriter writer("cat > /tmp/pipe");

// 写入数据
std::string message = "Hello pipe!\n";
if (!writer.write(message)) {
  std::cerr << "Failed to write data to pipe" << std::endl;
}

同様に、読み出しスレッドはデータを取り出します:

ProcessReader reader("/tmp/pipe");
// 读取数据
std::string message;
while (reader.read(message)) {
  // do something
}

最終的な結果は次のとおりです:

Read from pipe: Hello pipe!

関連トピック

コメント