Descrittore file FIFO condiviso

2

è ok per aprire fifo con un FD e condividerlo con più thread? o è meglio avere più fd aperti per lo stesso fifo e condividere questi file con i thread? A proposito, farò scrivere e leggere.

L'ambiente è linux, C, pthreads

    
posta poly 04.09.2012 - 22:00
fonte

2 risposte

1

Dipende da cosa esattamente farai. Di solito, se ci si attiene all'interfaccia di livello syscall (% descrittori di tipo int , metodi read e write ), un descrittore è ok, tranne se si desidera avere impostazioni diverse (alcuni di blocco, altri no e così) .

Ricorda che quando ci sono più lettori su fifo, uno casuale riceve i dati e il passaggio da un lettore all'altro può avvenire dopo ogni byte (perché dipende dalla granularità di scrittura e implementazione interna del buffer nel kernel), quindi hai bisogno di un fifo per ciascun destinatario o di messaggi a byte singolo.

    
risposta data 06.09.2012 - 09:18
fonte
1

Modifica:
Alcuni aggiornamenti aggiuntivi, stimolati in parte dai commenti di Jan Hudec (oggetti di scena Jan!)

Dai documenti OpenGroup Posix

 3.289 Process

An address space with one or more threads executing within that address space, 
and the required system resources for those threads.

Note:
    Many of the system resources defined by POSIX.1-2008 are shared among all of the 
threads within a process. These include the process ID, the parent process ID, process 
group ID, session membership, real, effective, and saved set-user-ID, real, effective, 
and saved set-group-ID, supplementary group IDs, current working directory, root 
directory, file mode creation mask, and file descriptors. 
  • Quindi, se tutti i thread si trovano nello stesso processo, finiranno comunque per utilizzare lo stesso descrittore di file. Ma questo è qualcosa che lascerei il sistema operativo per voi in quanto sarà un mal di testa di cui preoccuparsi.

  • ( stesso riferimento sopra, sotto Scostamento file ) Poiché si ha a che fare con FIFO, non ci si deve preoccupare dell'offset del file memorizzato insieme al descrittore di file. Se avevi a che fare con file normali, questo potrebbe essere un problema di cui essere a conoscenza.

Risposta rivista

Ci sono due casi da considerare:
1. Un processo con più thread
2. due (o più) processi con uno o più thread.

Nel primo caso, tutti i thread avranno lo stesso descrittore di file per FIFO perché è così che il sistema operativo lo gestisce per te.

Nel secondo caso, se condividi il descrittore di file tra i vari processi threads , probabilmente dovrai gestire la concorrenza di accesso.

Sono abbastanza certo che tu sia nel primo caso, non nel secondo.

Come Jan ha sottolineato che le chiamate read non sono garantite per essere atomiche. Ma l'intento è che siano così. Vedi i paragrafi 2 e 4 sotto Input e Output dalla sezione Razionale di il manuale . La condivisione dei descrittori di file tra processi può solo rendere più complicati quei problemi di concorrenza.

A parità di tutti gli altri, dal momento che il sistema operativo gestisce gran parte di questo per voi, utilizzerei l'approccio con più descrittori, anche se probabilmente porterà allo stesso valore del descrittore di file utilizzato. Il mio ragionamento principale è che è meno codice che devi scrivere e mantenere. Puoi avere una singola routine che viene chiamata da ogni thread per ottenere il descrittore. Un ulteriore vantaggio è che ti imposta bene nel caso in cui sia necessario eseguire il fork di nuovi processi invece di generare thread secondari.

    
risposta data 05.09.2012 - 05:14
fonte

Leggi altre domande sui tag