2012-03-30 34 views
6

Tengo un escenario donde creé un conducto para la comunicación entre dos elementos secundarios y secundarios. El padre escribe datos (usando la función de escritura) en el conducto y cierra el descriptor de archivo respectivo. El problema es cuando quiero volver a escribir datos en la tubería, la función de escritura devuelve el código de error -1. Creo que es porque el final de la escritura se ha cerrado en la iteración anterior. Luego, cómo abrir el descriptor de archivo correspondiente una vez que se ha cerrado.Cómo volver a abrir un descriptor de archivo cerrado

Intenté usar la función de apertura() que requiere la ruta a algún archivo como argumento. Pero no estoy usando ningún archivo en mi aplicación. Tengo descripciones de archivos simples (int arr [2]).

¿Es posible lograr el escenario anterior con tuberías ????

Respuesta

10

Una vez que se cierra una tubería, se cierra. No puedes recuperarlo.

Si desea escribir más sobre él, no lo cierre en primer lugar, es tan simple como eso.

+3

si nosotros no cerrar el descriptor de fichero, no va a enviar EOF a la corriente respectiva. Por lo tanto, en el proceso secundario esperará continuamente por la entrada. Pero, quiero escribir un número limitado de veces en la secuencia y leer al mismo tiempo en el otro extremo de la tubería – chaitu

+0

@chaitu: Es cierto que si no cierra el final de escritura, el final de lectura no se mostrará al final del archivo . Esto significa que debe usar algo que no sea el final del archivo para indicar el final de su mensaje, si desea enviar más mensajes al niño (por lo general, usaría un mensaje de longitud fija para que el niño sepa por cuánto tiempo) es). – caf

1

Lo que debe saber acerca de cualquier cosa relacionada con los archivos (las pipas también son algún tipo de archivos) bajo Unix: el nombre del archivo se usa solo en el archivo de apertura. Más tarde hasta que el archivo esté abierto, estará disponible para siempre hasta que se cierre y el nombre nunca se vuelva a utilizar. Cuando alguien borra el archivo en otra ventana mientras está abierto, solo el nombre se ha ido, no el archivo. Esto significa:

  1. archivo todavía está en el disco
  2. No tiene nombre
  3. Todavía está abierto
  4. Cuando está cerrado, el núcleo elimina para siempre

Sabiendo esto quizá ayuda para entender, por qué esto sería casi imposible para "volver a abrir" el archivo, la tubería o algo similar otra vez. El nombre de archivo y el descriptor tienen diferentes tiempos de vida.

Las únicas excepciones son stdout y stderr cuyo descriptor siempre son conocidos como 1 y 2.

Cuestiones relacionadas