Перейти к содержанию

Последнее обновление:2026-10-12

Межпроцессное взаимодействие в C++ на практике

Межпроцессное взаимодействие — очень важная тема; оно встречается почти во всех крупных проектах: например, PostgreSQL использует каналы (pipe) для межпроцессового взаимодействия при copy. В этом разделе на эту тему мы построим на C++ демо обмена между процессами через канал, объединив материал предыдущих разделов и дав довольно полный практический пример:

  • 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.

Итак, базовое использование канала рассмотрено — как написать полное демо?

Очень просто: создаём два потока, один читает, другой пишет; поток записи пишет данные в 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!

Похожие темы

Комментарии