Saltar a contenido

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

// FILE *popen(const char *command, const char *type);
pipe = popen(command.c_str(), "w");
  • Cerrar una tubería
// int pclose(FILE *stream);
pclose(pipe);

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:

Read from pipe: Hello pipe!

Temas relacionados

Comentarios