2009-10-17 6 views

Respuesta

20
  • tuberías son unidireccionales, por lo que necesita dos tubos de tener una comunicación bidireccional, mientras que un socketpair es bidireccional.

  • las tuberías siempre están orientadas a la transmisión, mientras que las cajas de conexión pueden orientarse a datagramas.

  • socketpairs son normales AF_UNIX sockets, lo que significa que los mensajes auxiliares como SCM_RIGHTS y SCM_CREDENTIALS se pueden pasar por encima de ellos.

En el kernel, las tuberías se implementan en el código del sistema de archivos y los pares de llaves del código de red.

+0

Creo que también los socketpairs soportan lecturas parciales y las tuberías no. – poolie

+1

¿Hay alguna diferencia de rendimiento entre ellos? – C2H5OH

11

Las capacidades shutdown() y SCM_RIGHTS de los socketpairs son necesarias para implementar una comunicación a prueba de carreras con subprocesos en un programa multiproceso.

Las tuberías se pueden duplicar por accidente en el caso de varios hilos pipe() y fork() al mismo tiempo; en ese caso, el extremo de escritura de la tubería nunca se cierra y EOF nunca puede ocurrir en el extremo de lectura, lo que causa un interbloqueo. Incluso para aquellos programas que utilizan fork() para subprocesos solamente (es decir, todos fork() s son seguidos rápidamente por execve() en el niño), captura de tubería por un concurrentes fork() carreras aún con la configuración del bit FD_CLOEXEC, salvo el uso de la llamada pipe2() sistema no portátil Linux que acepta O_CLOEXEC.

La solución de este peligro en un modo portátil, también para programas que fork() sin luego llamar execve(), implica socketpairs:

  • para un canal de salida (es decir, escribiendo desde el programa principal al subproceso): utilizar una socketpair en lugar de un conducto y llame al shutdown() antes del close() del padre para causar una condición de EOF a prueba de carrera, independientemente de si el descriptor del archivo fue duplicado.
  • Para un canal entrante (es decir, leyendo desde el subproceso), cree un conducto en el elemento secundario (para que el extremo de escritura nunca sea visible en el elemento primario para la duplicación accidental) y envíe solo el extremo de lectura al elemento principal a través de un socket un mensaje SCM_RIGHTS.
Cuestiones relacionadas