Domanda

Ho alcune domande di base circa i tubi non sono sicuro circa.

a) Qual è il comportamento standard se una scrittura processo ad un tubo viene ucciso (cioè SIGKILL. SIGINT) Ha chiudere il tubo? Ha lavare il tubo? O non è definito il comportamento?

b) Qual è il comportamento standard se un processo ritorna normalmente? E 'garantito per svuotare il tubo e chiudere il tubo? (Senza esplicitamente di farlo, naturalmente).

Vorrei queste risposte per essere il più generale possibile, ma in realtà se dipende interamente le specifiche del sistema operativo posso accettare che! Tuttavia, se v'è uno standard Posix o di una corrente di comportamento di Windows definito sarei molto grato di sapere.

Grazie.

È stato utile?

Soluzione

  

a. Qual è il comportamento standard se una scrittura processo ad un tubo viene ucciso (es. SIGKILL SIGINT) Ha chiudere il tubo? Ha lavare il tubo? O non è definito il comportamento?

SIGKILL non permette alcuna pulizia - il processo muore, morto. Con SIGINT, dipende dal fatto che il processo gestisce il segnale. Se è così, è probabile che per uscire attraverso l'uscita (2), che svuota handle di file I / O standard. La domanda è - stata tubo collegato all'uscita standard o tramite popen ()? In tal caso, i dati nel buffer in sospeso possono essere lavati; in caso contrario, non ci sono dati tamponato in modo da vampate di calore è irrilevante.

Se ci sono dati da leggere nel tubo, che i dati rimane nel tubo, pronto per il lettore a raccogliere -. Presumere che v'è un lettore

  

b. Qual è il comportamento standard se un processo ritorna normalmente? E 'garantito per svuotare il tubo e chiudere il tubo? (Senza esplicitamente di farlo, naturalmente).

Dipende se il tubo è stato collegato attraverso I / O standard o meno. In caso contrario, non v'è nulla in sospeso. Se è così, allora sì, qualsiasi materiale nei buffer verrà lavata come standard I / O flusso è chiuso.


  

c. Grazie per le informazioni sui segnali ei dati da leggere, ma io sono un po 'confuso circa il raccordo di I / O standard. Dopo aver citato popen () ho guardato in su e la pagina man dice il suo valore di ritorno identico a un flusso di I / O e le correnti sono completamente tamponato per impostazione predefinita. Non sono solo chiare sulla differenza tra i due e non capisco dove la differenza viene.

La chiamata di sistema di base per la creazione di tubi è pipe(2). Si crea due descrittori di file, uno per la fine lettura del tubo, uno per la fine di scrittura. Se non altro con loro, poi rimangono come descrittori di file, con uscita senza buffer (tramite scrittura (2) e chiamate di sistema correlate). Se il processo termina, non c'è buffer nella domanda; il tubo è chiuso.

Se si utilizza popen(3), poi lo fa molto di più lavoro per voi. Si invoca ancora pipe(2) per creare i tubi, ma poi fa un fork(2). Il bambino organizza la corretta configurazione dei tubi e lancia il processo figlio. Il genitore si chiude anche la fine inutilizzato del tubo, e usa fdopen(3) per creare un flusso di file di I / O standard per il processo chiamante da utilizzare.

Con il flusso di file, se ci sono dati nel buffer di I / O, quindi una stretta o equivalente farà in modo che i dati in sospeso è arrossato e il descrittore di file viene chiuso.

Altri suggerimenti

Il comportamento normale è che tutti i descrittori di file sono chiusi quando un processo termina. Ciò significa che un tubo, come qualsiasi altro descrittore di file aperto, viene chiuso normalmente.

Una cosa interessante di tubi, però: in POSIX, se un processo scrive ad un tubo che è stato chiuso, lo scrittore otterrà un segnale, SIGPIPE.


Edit:

Un avvertimento: La differenza tra s terminazione SIGx e una terminazione normale è che, come ogni altra scrittura di file, è possibile perdere dati che è stato tamponato (tramite una scrittura FILE) e non ancora scritti nel descrittore di file

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top