Последнее обновление:2026-10-12
Межпроцессное взаимодействие в C++ на практике¶
Межпроцессное взаимодействие — очень важная тема; оно встречается почти во всех крупных проектах: например, PostgreSQL использует каналы (pipe) для межпроцессового взаимодействия при copy. В этом разделе на эту тему мы построим на C++ демо обмена между процессами через канал, объединив материал предыдущих разделов и дав довольно полный практический пример:
- mutex
- condition_variable
- thread
Примечание: полный код этого раздела будет выложен в закрытом сообществе.
Самое простое использование канала:
- создать канал
Он выполняет creating a pipe, forking, and invoking the shell.
- закрыть канал Теперь нам остаётся только писать в него и читать из него; принцип тоже прост, например:Так 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);
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();
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
}
Похожие темы¶
- Пишем C++ FnOnce вручную | C++那些事
- Небольшой проект на C++ gRPC | C++那些事
- Демо сервиса коротких ссылок на C++ | C++那些事
- C++17 и SQLite: подсчёт размера каталога | C++那些事
- Тестирование производительности Google Benchmark | C++那些事
- HTTP-сервер на корутинах C++20 | C++那些事
- Сериализация Protobuf ZeroCopy | C++那些事
- Ускорение Python с помощью pybind11 | C++那些事
- Проектирование стекового калькулятора на C++ | C++那些事