2012-03-30 18 views
6

Ho uno scenario in cui ho creato pipe per la comunicazione tra due figli e padre. Genitore scrive (usando la funzione di scrittura) i dati nella pipe e chiude il rispettivo descrittore di file. Il problema è quando voglio scrivere di nuovo i dati nella pipe, la funzione write restituisce il codice di errore -1. Penso che sia perché la fine della scrittura è stata chiusa nella precedente iterazione. Quindi come aprire il descrittore di file corrispondente dopo che è stato chiuso una volta.Come riaprire un descrittore di file chiuso

Ho provato a utilizzare la funzione open() che richiede il percorso di alcuni file come argomento. Ma non sto usando alcun file nella mia applicazione. Ho dei descrittori di file semplici (int arr [2]).

E 'possibile raggiungere lo scenario sopra con i tubi ????

risposta

10

Una volta che un tubo è chiuso, è chiuso. Non puoi riportarlo indietro.

Se vuoi scriverne di più, non chiuderlo in primo luogo - è così semplice.

+3

se noi non chiudere il descrittore di file, esso non invierà EOF al rispettivo flusso. Quindi nel processo figlio aspetterà continuamente per l'input. Ma, voglio scrivere un numero limitato di volte nello stream e leggere contemporaneamente all'altra estremità della pipe – chaitu

+0

@chaitu: È vero che se non chiudi la fine della scrittura, la fine della lettura non mostrerà la fine del file . Ciò significa che è necessario utilizzare un elemento diverso dalla fine del file per indicare la fine del messaggio, se si desidera inviare più messaggi al figlio (in genere, si utilizzerà un messaggio a lunghezza fissa in modo che il bambino sappia per quanto tempo è). – caf

1

Informazioni su tutto ciò che riguarda i file (le pipe sono anche alcuni tipi di file) sotto unix: il nome del file viene utilizzato solo sul file di apertura. Più tardi fino all'apertura del file, sarà disponibile per sempre fino alla chiusura e il nome non verrà più utilizzato. Quando qualcuno cancella un file in un'altra finestra mentre è aperto, solo il nome è scomparso, non il file. Ciò significa:

  1. file è ancora sul disco
  2. Non ha un nome
  3. E 'ancora aperta
  4. Quando è chiuso, il kernel toglie per sempre

Sapendo questo aiuta forse per capire, perché sarebbe quasi impossibile "riaprire" di nuovo file, pipe o qualcosa di simile. Il nome del file e il descrittore hanno diverse durate.

Le uniche eccezioni sono stdout e stderr cui descrittore sono sempre conosciuto come 1 e 2.

Problemi correlati