Me gustaría saber no solo las diferencias del lado del usuario, sino también las diferencias/partes comunes en la implementación del kernel de Linux.¿Hay alguna diferencia entre socketpair y un par de tubos sin nombre?
Respuesta
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 comoSCM_RIGHTS
ySCM_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.
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 delclose()
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
.
- 1. Tubos con nombre sin bloqueo
- 2. ¿Hay alguna diferencia entre System.Windows.Clipboard y System.Windows.Forms.Clipboard?
- 3. ¿Hay alguna diferencia entre UITableViewCellAccessoryDetailDisclosureButton y UITableViewCellAccessoryDisclosureIndicator
- 4. ¿Hay alguna diferencia entre SSLv3 y TLS1.0?
- 5. ¿Hay alguna diferencia entre MsgBox y MessageBox.Show?
- 6. ¿Hay alguna diferencia entre DataTable.Clear y DataTable.Rows.Clear?
- 7. ¿Hay alguna diferencia entre log4net.Config.BasicConfigurator.Configure() y log4net.Config.XmlConfigurator.Configure()?
- 8. ¿Hay alguna diferencia entre gluLookAt() y glFrustum()?
- 9. ¿Hay alguna diferencia entre (local), '.' y localhost?
- 10. ¿Hay alguna diferencia entre CPython y Python
- 11. ¿Hay alguna diferencia entre: window.localStorage y localStorage?
- 12. ¿Hay alguna diferencia entre `ListView.invalidateViews()` y 'Adapter.notifyDataSetChanged()'?
- 13. ¿Hay alguna diferencia entre! == y! = En PHP?
- 14. ¿Hay alguna diferencia entre .NET y ASP.NET
- 15. ¿Hay alguna diferencia entre is_int() y ctype_digit()?
- 16. ¿Hay alguna diferencia entre readonly y {get; }
- 17. ¿Hay alguna diferencia entre un CGRect y un NSRect?
- 18. ¿Hay alguna diferencia entre un control y un widget?
- 19. ¿Hay alguna diferencia entre un GUID y un UUID?
- 20. ¿Hay alguna diferencia entre una entidad y un objeto?
- 21. ¿Hay alguna diferencia entre "Objeto [] x" y "Objeto x []"?
- 22. En Rails 3, ¿hay alguna diferencia entre = y assign_attributes?
- 23. ¿Hay alguna diferencia (de rendimiento) entre Depurar y Liberar?
- 24. ¿Hay alguna diferencia de rendimiento entre myCollection.Where (...). FirstOrDefault() y myCollection.FirstOrDefault (...)
- 25. ¿Hay alguna diferencia entre las manchas y los componentes conectados?
- 26. ¿Hay alguna diferencia entre delegate/selector y target/action?
- 27. ¿Hay alguna diferencia entre SqlConnection.CreateCommand y el nuevo SqlCommand?
- 28. ¿Hay alguna diferencia entre BOOL y Boolean en Objective-C?
- 29. ¿Hay alguna diferencia entre RPC e IPC?
- 30. ¿Hay alguna diferencia entre 'imprimir' y 'eco' en PHP?
Creo que también los socketpairs soportan lecturas parciales y las tuberías no. – poolie
¿Hay alguna diferencia de rendimiento entre ellos? – C2H5OH