Última actualización:2026-10-12
Comunicación entre procesos en C++ en la práctica¶
La comunicación entre procesos es un tema muy importante; especialmente en proyectos grandes siempre aparece su sombra: por ejemplo, PostgreSQL usa tuberías para la comunicación entre procesos del copy. Basándonos en este tema, en esta sección usaremos C++ para montar una demo de comunicación entre procesos mediante tuberías, combinando lo explicado en las secciones anteriores (mutex, condition_variable y thread) para dar un ejemplo práctico bastante completo:
- mutex
- condition_variable
- thread
Nota: el código completo de esta sección se publicará en la comunidad 星球.
Primero, un uso muy sencillo de las tuberías:
- Crear una tubería
Esto hará creating a pipe, forking, and invoking the shell.
- Cerrar una tubería
A partir de aquí solo nos queda escribir y leer en ella; el principio también es muy sencillo; por ejemplo:
Con esto los data se escriben en la tubería creada antes.
// 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);
Para leer de la tubería podemos usar fread o fgets: fgets se detiene al leer un salto de línea o al alcanzar el tamaño del búfer, mientras que fread lee tantos datos como pueda hasta llegar al número de bytes indicado o al final del archivo. De forma análoga, el fwrite anterior puede sustituirse por fputs.
Ya está presentado el uso básico de una tubería; ¿cómo escribir una demo completa?
Muy sencillo: solo necesitamos crear dos hilos, uno que lea y otro que escriba; el hilo escritor mete datos en la pipe y el hilo lector los saca.
Por ejemplo:
std::thread writer_thread(write_to_pipe);
std::thread reader_thread(read_from_pipe);
writer_thread.join();
reader_thread.join();
Lo que debe hacer el hilo escritor es simplemente llamar a fwrite para lanzar los datos
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;
}
Análogamente, el hilo lector toma los datos:
ProcessReader reader("/tmp/pipe");
// 读取数据
std::string message;
while (reader.read(message)) {
// do something
}
El efecto final es:
Temas relacionados¶
- Implementando C++ FnOnce a mano | C++那些事
- Pequeño proyecto gRPC en C++ | C++那些事
- Demo de servicio de URL cortas en C++ | C++那些事
- C++17 y SQLite para medir el tamaño de directorios | C++那些事
- Pruebas de rendimiento con Google Benchmark | C++那些事
- Servidor HTTP con corrutinas de C++20 | C++那些事
- Serialización ZeroCopy con Protobuf | C++那些事
- Acelerar Python con pybind11 | C++那些事
- Diseño de una calculadora de pila en C++ | C++那些事