2014-07-15 6 views
7

Sto leggendo le tubazioni in UNIX per la comunicazione tra processi tra 2 processi. Ho una domanda seguenteÈ davvero necessario chiudere l'estremità inutilizzata della pipa in un processo

È davvero necessario chiudere l'estremità inutilizzata del tubo? per esempio, se il mio processo genitore sta scrivendo i dati nella pipe e child sta leggendo dalla pipe, è veramente necessario chiudere la parte di lettura della pipe nel processo padre e chiudere la fine della scrittura dal processo figlio? Ci sono effetti collaterali se non chiudo quelle estremità? Perché abbiamo bisogno di chiudere quelle estremità?

+0

Non so se è un comportamento indefinito se ci sono due limiti di lettura, ma solo uno effettivamente legge dalla pipe. –

risposta

10

Ecco il problema se non lo fai. Nel tuo esempio, il genitore crea una pipa per scrivere al bambino. Quindi, il bambino si biforca ma non chiude il proprio descrittore di lettura. Ciò significa che ci sono ancora due descrittori di lettura sul tubo.

Se il bambino aveva l'unico e lo chiudeva (ad esempio uscendo), il genitore avrebbe ricevuto un segnale SIGPIPE o, se questo era mascherato, un errore nella scrittura sulla pipe.

Tuttavia, c'è un secondo descrittore di lettura sul tubo (quello del genitore). Ora, se il bambino esce, il tubo rimarrà aperto. Il genitore può continuare a scrivere nella pipe fino a quando non riempie e la successiva scrittura bloccherà (o ritornerà senza scrivere se non è bloccante).

Pertanto, non chiudendo il descrittore di lettura del genitore, il genitore non può rilevare che il bambino ha chiuso il suo descrittore.

3

Secondo la pagina man per getdtablesize

Ogni processo ha una tabella descrittore dimensione fissa, che è garantito per avere almeno 20 slot.

Ogni pipe utilizza due voci nella tabella dei descrittori. La chiusura dell'estremità non necessaria del tubo libera uno di questi descrittori. Quindi, se sei abbastanza sfortunato da trovarti in un sistema in cui ogni processo è limitato a 20 descrittori, sarai altamente motivato a liberare i descrittori di file non necessari.

+1

Generalmente, non chiudere i descrittori di file è come non liberare memoria. Stai hogging risorse di sistema che possono essere rari. Esiste anche un limite comune (morbido) di 1024 descrittori di file totali. –

1

I tubi sono destinati ad essere utilizzati come canali di comunicazione unidirezionali. La loro chiusura è una buona pratica che consente di evitare qualche disordine nei messaggi inviati. Il descrittore dello scrittore dovrebbe essere chiuso per il lettore e viceversa.