Esencialmente, las tuberías, ya sean nominadas o anónimas, se utilizan como mensajes. Alguien envía una información al destinatario y el destinatario puede recibirla. La memoria compartida se parece más a la publicación de datos: alguien coloca los datos en la memoria compartida y los lectores (potencialmente muchos) deben usar la sincronización, p. a través de semáforos para aprender sobre el hecho de que hay datos nuevos y debe saber cómo leer la región de memoria para encontrar la información.
Con los tubos, la sincronización es simple y está integrada en el propio mecanismo de la tubería: sus lecturas y escrituras se congelarán y descongelarán la aplicación cuando ocurra algo interesante. Con la memoria compartida, es más fácil trabajar de forma asíncrona y buscar nuevos datos solo de vez en cuando, pero a costa de un código mucho más complejo. Además, puede obtener comunicación de muchos a muchos, pero requiere más trabajo nuevamente. Además, debido a lo anterior, la depuración de la comunicación basada en tuberías es más fácil que la depuración de la memoria compartida.
Una pequeña diferencia es que los fifos son visibles directamente en el sistema de archivos, mientras que las regiones de memoria compartida necesitan herramientas especiales como ipcs
para su gestión en caso de que, por ejemplo, crea un segmento de memoria compartida, pero tu aplicación muere y no se limpia después de ella (lo mismo ocurre con los semáforos y muchos otros mecanismos de sincronización que podrías necesitar junto con la memoria compartida).
La memoria compartida también le brinda más control sobre el almacenamiento en búfer y el uso de recursos: dentro de los límites permitidos por el sistema operativo, es usted quien decide cuánta memoria asignar y cómo usarla. Con las tuberías, el sistema operativo controla las cosas automáticamente, por lo que una vez más se pierde cierta flexibilidad, pero se alivian de mucho trabajo.
Resumen de los puntos más importantes: tubos para la comunicación uno a uno, menos codificación y para que el SO maneje cosas, memoria compartida para muchos a muchos, más control manual sobre las cosas pero a costa de más trabajo y depuración más difícil.
Tenga en cuenta que las escrituras son solo atómicas, si no superiores a PIPE_BUF en tamaño. –