X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=ipc.tex;h=e18dbbc157fcf487eddda20ff8a1613c69280e02;hb=3f54abef203116c1324e37e78a554f84cc4b7743;hp=74b51365d4f7311193f2d8e734121abfe2fcd02f;hpb=f03c81e511c5c9c5c65f9b2bcd21dc7664c08b38;p=gapil.git diff --git a/ipc.tex b/ipc.tex index 74b5136..e18dbbc 100644 --- a/ipc.tex +++ b/ipc.tex @@ -3250,12 +3250,11 @@ una interfaccia completamente nuova, che tratteremo in questa sezione. \subsection{Considerazioni generali} \label{sec:ipc_posix_generic} -In Linux non tutti gli oggetti del POSIX IPC sono pienamente supportati nel -kernel ufficiale; solo la memoria condivisa è presente con l'interfaccia -completa, ma solo a partire dal kernel 2.4.x, i semafori sono forniti dalle -\acr{glibc} nella sezione che implementa i thread POSIX, le code di messaggi -non hanno alcun tipo di supporto ufficiale. Per queste ultime esistono -tuttavia dei patch e una libreria aggiuntiva. +Oggi Linux supporta tutti gli oggetti definito nello standard POSIX per l'IPC, +ma a lungo non è stato così; la memoria condivisa è presente a partire dal +kernel 2.4.x, i semafori sono forniti dalle \acr{glibc} nella sezione che +implementa i thread POSIX di nuova generazione che richiedono il kernel 2.6, +le code di messaggi sono supportate a partire dal kernel 2.6.6. La caratteristica fondamentale dell'interfaccia POSIX è l'abbandono dell'uso degli identificatori e delle chiavi visti nel SysV IPC, per passare ai @@ -3315,14 +3314,14 @@ processo che esegue la creazione. \label{sec:ipc_posix_mq} Le code di messaggi POSIX sono supportate da Linux a partire dalla versione -2.6.6-rc1 del kerne;, \footnote{l'implementazione è dovuta a Michal Wronski e +2.6.6-rc1 del kernel,\footnote{l'implementazione è dovuta a Michal Wronski e Krzysztof Benedyczak, e le relative informazioni si possono trovare su \href{http://www.geocities.com/wronski12/posix_ipc/index.html} {\texttt{http://www.geocities.com/wronski12/posix\_ipc/index.html}}.} In generale, come le corrispettive del SysV IPC, le code di messaggi sono poco usate, dato che i socket, nei casi in cui sono sufficienti, sono più comodi, e che in casi più complessi la comunicazione può essere gestita direttamente con -mutex e memoria condivisa con tutta la flessibilità che occorre. +mutex (o semafori) e memoria condivisa con tutta la flessibilità che occorre. Per poter utilizzare le code di messaggi, oltre ad utilizzare un kernel superiore al 2.6.6 (o precedente, purché cui siano stati opportunamente @@ -3585,11 +3584,16 @@ valore della priorit \const{MQ\_PRIO\_MAX}, che nel caso è pari a 32768. Qualora la coda sia piena, entrambe le funzioni si bloccano, a meno che non -sia stata selezionata in fase di apertura la modalità non bloccante, nel qual -caso entrambe ritornano \errcode{EAGAIN}. La sola differenza fra le due -funzioni è che la seconda, passato il tempo massimo impostato con l'argomento -\param{abs\_timeout}, ritorna comunque con un errore di \errcode{ETIMEDOUT}. - +sia stata selezionata in fase di apertura la modalità non +bloccante,\footnote{o si sia impostato il flag \const{O\_NONBLOCK} sul file + descriptor della coda.} nel qual caso entrambe ritornano \errcode{EAGAIN}. +La sola differenza fra le due funzioni è che la seconda, passato il tempo +massimo impostato con l'argomento \param{abs\_timeout},\footnote{deve essere + specificato un tempo assoluto tramite una struttura \struct{timespec} (vedi + fig.~\ref{fig:sys_timeval_struct}) indicato in numero di secondi e + nanosecondi a partire dal 1 gennaio 1970.} ritorna comunque con un errore di +\errcode{ETIMEDOUT}, se invece il tempo è già scaduto al momento della +chiamata e la coda è vuota la funzione ritorna immediatamente. Come per l'inserimento, anche per l'estrazione dei messaggi da una coda sono previste due funzioni, \funcd{mq\_receive} e \funcd{mq\_timedreceive}, i cui @@ -3626,7 +3630,11 @@ prototipi sono: La funzione estrae dalla coda il messaggio a priorità più alta, o il più vecchio fra quelli della stessa priorità. Una volta ricevuto il messaggio viene tolto dalla coda e la sua dimensione viene restituita come valore di -ritorno. +ritorno.\footnote{si tenga presente che 0 è una dimensione valida la + condizione di errore è restituita dal valore -1; Stevens in \cite{UNP2} fa + notare che questo è uno dei casi in cui vale ciò che lo standard + \textsl{non} dice, una dimensione nulla infatti, pur non essendo citata, non + viene proibita.} Se la dimensione specificata da \param{msg\_len} non è sufficiente a contenere il messaggio, entrambe le funzioni, al contrario di quanto avveniva nelle code @@ -3645,10 +3653,8 @@ Qualora non interessi usare la priorit Si noti che con le code di messaggi POSIX non si ha la possibilità di selezionare quale messaggio estrarre con delle condizioni sulla priorità, a differenza di quanto avveniva con le code di messaggi di SysV che permettono -invece la selezione in base al valore del campo \var{mtype}. Qualora non -interessi usare la priorità dei messaggi si +invece la selezione in base al valore del campo \var{mtype}. -% TODO vericare questa interruzione di paragrafo % TODO inserire i dati di /proc/sys/fs/mqueue Qualora la coda sia vuota entrambe le funzioni si bloccano, a meno che non si @@ -3748,7 +3754,7 @@ all'userid effettivo, \var{si\_code} a \const{SI\_MESGQ}, e \var{si\_errno} a 0. Questo ci dice che, se si effettua la ricezione dei messaggi usando esclusivamente il meccanismo di notifica, è possibile ottenere le informazioni sul processo che ha inserito un messaggio usando un gestore per il segnale in -forma estesa\footnote{di nuovo si faccia riferimento a quanto detto al +forma estesa.\footnote{di nuovo si faccia riferimento a quanto detto al proposito in sez.~\ref{sec:sig_sigaction} e sez.~\ref{sec:sig_real_time}.} @@ -3756,37 +3762,58 @@ forma estesa\footnote{di nuovo si faccia riferimento a quanto detto al \subsection{Semafori} \label{sec:ipc_posix_sem} -Dei semafori POSIX esistono sostanzialmente due implementazioni; una è fatta a -livello di libreria ed è fornita dalla libreria dei thread; questa però li -implementa solo a livello di thread e non di processi.\footnote{questo - significa che i semafori sono visibili solo all'interno dei thread creati da - un singolo processo, e non possono essere usati come meccanismo di - sincronizzazione fra processi diversi.} Esiste però anche una libreria -realizzata da Konstantin Knizhnik, che reimplementa l'interfaccia POSIX usando -i semafori di SysV IPC, e che non vale comunque la pena di usare visto che i -problemi sottolineati in sez.~\ref{sec:ipc_sysv_sem} rimangono, anche se -mascherati. - -In realtà a partire dal kernel 2.5.7 è stato introdotto un meccanismo di +Fino alla serie 2.4.x del kernel esistevano due implementazioni dei semafori +POSIX; una parziale che li realizzava solo a livello di thread e non di +processi,\footnote{questo significava che i semafori erano visibili solo + all'interno dei thread creati da un singolo processo, e non potevano essere + usati come meccanismo di sincronizzazione fra processi diversi.} presente +nella sezione delle estensioni \textit{real-time} delle +\acr{glibc},\footnote{quelle che si accedono collegandosi alla libreria + \texttt{librt}.} ed una che realizzava l'interfaccia POSIX usando le +funzioni dei semafori di SysV IPC (mantenendo così tutti i problemi +sottolineati in sez.~\ref{sec:ipc_sysv_sem}). + +A partire dal kernel 2.5.7 è stato introdotto un meccanismo di sincronizzazione completamente nuovo, basato sui cosiddetti -\textit{futex}\footnote{la sigla sta per \textit{fast user mode mutex}.}, con -il quale è stato possibile implementare una versione nativa dei semafori; esso -è già stato usato con successo per reimplementare in maniera più efficiente -tutte le direttive di sincronizzazione previste per i thread POSIX; e con il -kernel della serie 2.6 e le nuove versioni delle \acr{glibc} che usano quella -che viene chiamata la \textit{New Posix Thread Library} sono state -implementate tutte le funzioni occorrenti. - -Anche in questo caso (come per le code di messaggi) è necessario appoggiarsi -alla libreria per le estensioni \textit{real-time} \texttt{librt}, questo -significa che se si vuole utilizzare questa interfaccia, oltre ad utilizzare -gli opportuni file di definizione, occorrerà compilare i programmi con -l'opzione \texttt{-lrt}. +\textit{futex},\footnote{la sigla sta per \textit{fast user mode mutex}.} con +il quale è stato possibile implementare una versione nativa dei semafori +POSIX. Grazie a questo con i kernel della serie 2.6 e le nuove versioni delle +\acr{glibc} che usano questa nuova infrastruttura per quella che viene quella +che viene chiamata \textit{New Posix Thread Library}, sono state implementate +anche tutte le funzioni dell'interfaccia dei semafori POSIX. + +Anche in questo caso è necessario appoggiarsi alla libreria per le estensioni +\textit{real-time} \texttt{librt}, questo significa che se si vuole utilizzare +questa interfaccia, oltre ad utilizzare gli opportuni file di definizione, +occorrerà compilare i programmi con l'opzione \texttt{-lrt}. % TODO trattare l'argomento a partire da man sem_overview. + +\begin{functions} + \headdecl{semaphore.h} + + \funcdecl{sem\_t *sem_open(const char *name, int oflag)} + + \funcdecl{sem\_t *sem_open(const char *name, int oflag,, mode_t mode, + unsigned int value)} + + Crea un semaforo o ne apre uno esistente. + + \bodydesc{Le funzioni restituiscono il numero di byte del messaggio in caso + di successo e -1 in caso di errore; nel quel caso \var{errno} assumerà i + valori: + \begin{errlist} + \item[\errcode{EAGAIN}] Si è aperta la coda con \const{O\_NONBLOCK}, e la + coda è vuota. + \end{errlist} + ed inoltre \errval{EBADF}, \errval{EINTR}, \errval{ENOMEM}, o + \errval{EINVAL}.} +\end{functions} + + \subsection{Memoria condivisa} \label{sec:ipc_posix_shm} @@ -3974,7 +4001,7 @@ restituendo al chiamante il valore di ritorno. % LocalWords: PDF EPS lseek ESPIPE PPM Portable PixMap format pnmcrop PNG pnm % LocalWords: pnmmargin png BarCode inode filesystem l'inode mknod mkfifo RDWR % LocalWords: ENXIO deadlock client reinviate fortunes fortunefilename daemon -% LocalWords: FortuneServer FortuneParse FortuneClient pid libgapil LD +% LocalWords: FortuneServer FortuneParse FortuneClient pid libgapil LD librt % LocalWords: PATH linker pathname ps tmp killall fortuned crash socket domain % LocalWords: socketpair BSD sys protocol sv EAFNOSUPPORT EPROTONOSUPPORT AF % LocalWords: EOPNOTSUPP SOCK SysV IPC Process Comunication ipc perm key exec @@ -3987,7 +4014,7 @@ restituendo al chiamante il valore di ritorno. % LocalWords: cmd struct buf EPERM RMID msgsnd msgbuf msgp msgsz msgflg EAGAIN % LocalWords: NOWAIT EINTR mtype mtext long message sizeof LENGTH ts sleep BIG % LocalWords: msgrcv ssize msgtyp NOERROR EXCEPT ENOMSG multiplexing select ls -% LocalWords: poll polling queue MQFortuneServer write init HandSIGTERM +% LocalWords: poll polling queue MQFortuneServer write init HandSIGTERM l'IPC % LocalWords: MQFortuneClient mqfortuned mutex risorse' inter semaphore semget % LocalWords: nsems SEMMNS SEMMSL semid otime semval sempid semncnt semzcnt nr % LocalWords: SEMVMX SEMOPM semop SEMMNU SEMUME SEMAEM semnum union semun arg @@ -4012,7 +4039,7 @@ restituendo al chiamante il valore di ritorno. % LocalWords: EBUSY sigev SIGNAL signo value sigval siginfo all'userid MESGQ % LocalWords: Konstantin Knizhnik futex tmpfs ramfs cache shared swap CONFIG % LocalWords: lrt blocks PAGECACHE TRUNC CLOEXEC mmap ftruncate munmap FindShm -% LocalWords: CreateShm RemoveShm LIBRARY +% LocalWords: CreateShm RemoveShm LIBRARY Library %%% Local Variables: