X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=43d2fe71eb94b68a643c3d1560c786bb3587969c;hp=5b28acdf9f6d19a5c107dfe0365961d21ea70d72;hb=e51dd0ef809bae5d7e8247e8e043f73d02cd0153;hpb=70860564e1de946ab8d681bb41c601ba77721709 diff --git a/signal.tex b/signal.tex index 5b28acd..43d2fe7 100644 --- a/signal.tex +++ b/signal.tex @@ -304,12 +304,12 @@ definiti in vari standard. \textbf{Sigla} & \textbf{Significato} \\ \hline \hline - A & L'azione predefinita è terminare il processo. \\ - B & L'azione predefinita è ignorare il segnale. \\ + A & L'azione predefinita è terminare il processo.\\ + B & L'azione predefinita è ignorare il segnale.\\ C & L'azione predefinita è terminare il processo e scrivere un - \itindex{core~dump} \textit{core dump}. \\ - D & L'azione predefinita è fermare il processo. \\ - E & Il segnale non può essere intercettato. \\ + \itindex{core~dump} \textit{core dump}.\\ + D & L'azione predefinita è fermare il processo.\\ + E & Il segnale non può essere intercettato.\\ F & Il segnale non può essere ignorato.\\ \hline \end{tabular} @@ -334,10 +334,10 @@ colonna standard sono stati indicati anche gli standard in cui ciascun segnale \textbf{Sigla} & \textbf{Standard} \\ \hline \hline - P & POSIX. \\ - B & BSD. \\ - L & Linux.\\ - S & SUSv2.\\ + P & POSIX \\ + B & BSD \\ + L & Linux \\ + S & SUSv2 \\ \hline \end{tabular} \caption{Legenda dei valori della colonna \textbf{Standard} di @@ -761,7 +761,7 @@ indicizzate per numero di segnale, per cui una chiamata del tipo di \code{char -\section{La gestione dei segnali} +\section{La gestione di base dei segnali} \label{sec:sig_management} I segnali sono il primo e più classico esempio di eventi asincroni, cioè di @@ -997,9 +997,9 @@ prototipo \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di errore nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EINVAL}] Il segnale specificato non esiste. - \item[\errcode{ESRCH}] Il processo selezionato non esiste. - \item[\errcode{EPERM}] Non si hanno privilegi sufficienti ad inviare il + \item[\errcode{EINVAL}] il segnale specificato non esiste. + \item[\errcode{ESRCH}] il processo selezionato non esiste. + \item[\errcode{EPERM}] non si hanno privilegi sufficienti ad inviare il segnale. \end{errlist}} \end{functions} @@ -1045,11 +1045,11 @@ Una seconda funzione che pu \textbf{Valore} & \textbf{Significato} \\ \hline \hline - $>0$ & il segnale è mandato al processo con il \acr{pid} indicato.\\ - 0 & il segnale è mandato ad ogni processo del \itindex{process~group} + $>0$ & Il segnale è mandato al processo con il \acr{pid} indicato.\\ + 0 & Il segnale è mandato ad ogni processo del \itindex{process~group} \textit{process group} del chiamante.\\ - $-1$ & il segnale è mandato ad ogni processo (eccetto \cmd{init}).\\ - $<-1$ & il segnale è mandato ad ogni processo del \textit{process group} + $-1$ & Il segnale è mandato ad ogni processo (eccetto \cmd{init}).\\ + $<-1$ & Il segnale è mandato ad ogni processo del \textit{process group} \itindex{process~group} $|\code{pid}|$.\\ \hline \end{tabular} @@ -1472,8 +1472,8 @@ tutti gli stati di terminazione sono stati ricevuti. -\section{Gestione avanzata} -\label{sec:sig_control} +\section{La gestione avanzata dei segnali} +\label{sec:sig_adv_control} Le funzioni esaminate finora fanno riferimento alle modalità più elementari della gestione dei segnali; non si sono pertanto ancora prese in @@ -1553,17 +1553,21 @@ vuoto. Ma anche questa implementazione comporta dei problemi; in questo caso infatti non viene gestita correttamente l'interazione con gli altri segnali; se -infatti il segnale di allarme interrompe un altro gestore, in questo caso -l'esecuzione non riprenderà nel gestore in questione, ma nel ciclo -principale, interrompendone inopportunamente l'esecuzione. Lo stesso tipo di -problemi si presenterebbero se si volesse usare \func{alarm} per stabilire un -timeout su una qualunque system call bloccante. +infatti il segnale di allarme interrompe un altro gestore, l'esecuzione non +riprenderà nel gestore in questione, ma nel ciclo principale, interrompendone +inopportunamente l'esecuzione. Lo stesso tipo di problemi si presenterebbero +se si volesse usare \func{alarm} per stabilire un timeout su una qualunque +system call bloccante. Un secondo esempio è quello in cui si usa il segnale per notificare una qualche forma di evento; in genere quello che si fa in questo caso è impostare nel gestore un opportuno flag da controllare nel corpo principale del programma (con un codice del tipo di quello riportato in -fig.~\ref{fig:sig_event_wrong}). +fig.~\ref{fig:sig_event_wrong}). La logica è quella di far impostare al +gestore (\texttt{\small 14-19}) una variabile globale preventivamente +inizializzata nel programma principale, il quale potrà determinare, +osservandone il contenuto, l'occorrenza o meno del segnale, e prendere le +relative azioni conseguenti (\texttt{\small 6-11}). \begin{figure}[!htb] \footnotesize\centering @@ -1576,18 +1580,12 @@ fig.~\ref{fig:sig_event_wrong}). \label{fig:sig_event_wrong} \end{figure} -La logica è quella di far impostare al gestore (\texttt{\small 14-19}) una -variabile globale preventivamente inizializzata nel programma principale, il -quale potrà determinare, osservandone il contenuto, l'occorrenza o meno del -segnale, e prendere le relative azioni conseguenti (\texttt{\small 6-11}). - Questo è il tipico esempio di caso, già citato in sez.~\ref{sec:proc_race_cond}, in cui si genera una \itindex{race~condition} \textit{race condition}; infatti, in una situazione in cui un segnale è già -arrivato (e \var{flag} è già ad 1) se un altro segnale segnale arriva -immediatamente dopo l'esecuzione del controllo (\texttt{\small 6}) ma prima -della cancellazione del flag (\texttt{\small 7}), la sua occorrenza sarà -perduta. +arrivato (e \var{flag} è già ad 1) se un altro segnale arriva immediatamente +dopo l'esecuzione del controllo (\texttt{\small 6}) ma prima della +cancellazione del flag (\texttt{\small 7}), la sua occorrenza sarà perduta. Questi esempi ci mostrano che per una gestione effettiva dei segnali occorrono delle funzioni più sofisticate di quelle finora illustrate, queste hanno la @@ -1687,10 +1685,10 @@ da un processo. Il suo prototipo \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EINVAL}] Si è specificato un numero di segnale invalido o si è + \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido o si è cercato di installare il gestore per \const{SIGKILL} o \const{SIGSTOP}. - \item[\errcode{EFAULT}] Si sono specificati indirizzi non validi. + \item[\errcode{EFAULT}] si sono specificati indirizzi non validi. \end{errlist}} \end{prototype} @@ -1738,13 +1736,13 @@ l'invocazione. L'uso di questo campo permette ad esempio di risolvere il problema residuo dell'implementazione di \code{sleep} mostrata in fig.~\ref{fig:sig_sleep_incomplete}. In quel caso infatti se il segnale di -allarme avesse interrotto un altro gestore questo non sarebbe stato -eseguito correttamente; la cosa poteva essere prevenuta installando gli altri -gestori usando \var{sa\_mask} per bloccare \const{SIGALRM} durante la -loro esecuzione. Il valore di \var{sa\_flag} permette di specificare vari -aspetti del comportamento di \func{sigaction}, e della reazione del processo -ai vari segnali; i valori possibili ed il relativo significato sono riportati -in tab.~\ref{tab:sig_sa_flag}. +allarme avesse interrotto un altro gestore questo non sarebbe stato eseguito +correttamente; la cosa poteva essere prevenuta installando gli altri gestori +usando \var{sa\_mask} per bloccare \const{SIGALRM} durante la loro esecuzione. +Il valore di \var{sa\_flag} permette di specificare vari aspetti del +comportamento di \func{sigaction}, e della reazione del processo ai vari +segnali; i valori possibili ed il relativo significato sono riportati in +tab.~\ref{tab:sig_sa_flag}. \begin{table}[htb] \footnotesize @@ -1759,34 +1757,43 @@ in tab.~\ref{tab:sig_sa_flag}. fermato da uno dei segnali \const{SIGSTOP}, \const{SIGTSTP}, \const{SIGTTIN} o \const{SIGTTOU}.\\ - \const{SA\_ONESHOT} & Ristabilisce l'azione per il segnale al valore + \const{SA\_RESETHAND}& Ristabilisce l'azione per il segnale al valore predefinito una volta che il gestore è stato lanciato, riproduce cioè il comportamento della semantica inaffidabile.\\ - \const{SA\_RESETHAND}& Sinonimo di \const{SA\_ONESHOT}. \\ + \const{SA\_ONESHOT} & Nome obsoleto, sinonimo non standard di + \const{SA\_RESETHAND}; da evitare.\\ + \const{SA\_ONSTACK} & Stabilisce l'uso di uno \itindex{stack} stack + alternativo per l'esecuzione del gestore (vedi + sez.~\ref{sec:sig_specific_features}).\\ \const{SA\_RESTART} & Riavvia automaticamente le \textit{slow system call} quando vengono interrotte dal suddetto segnale; riproduce cioè il comportamento standard di BSD.\index{system~call~lente}\\ - \const{SA\_NOMASK} & Evita che il segnale corrente sia bloccato durante + \const{SA\_NODEFER} & Evita che il segnale corrente sia bloccato durante l'esecuzione del gestore.\\ - \const{SA\_NODEFER} & Sinonimo di \const{SA\_NOMASK}.\\ + \const{SA\_NOMASK} & Nome obsoleto, sinonimo non standard di + \const{SA\_NODEFER}.\\ \const{SA\_SIGINFO} & Deve essere specificato quando si vuole usare un gestore in forma estesa usando - \var{sa\_sigaction} al posto di \var{sa\_handler}.\\ - \const{SA\_ONSTACK} & Stabilisce l'uso di uno \itindex{stack} stack - alternativo per l'esecuzione del gestore (vedi - sez.~\ref{sec:sig_specific_features}).\\ + \var{sa\_sigaction} al posto di + \var{sa\_handler}.\\ + \const{SA\_NOCLDWAIT}& Se il segnale è \const{SIGCHLD} allora o processi + figli non divenire \textit{zombie} quando + terminano.\footnotemark \\ \hline \end{tabular} \caption{Valori del campo \var{sa\_flag} della struttura \struct{sigaction}.} \label{tab:sig_sa_flag} \end{table} +\footnotetext{questa funzionalità è stata introdotta nel kernel 2.6 e va a + modificare il comportamento di \func{waitpid}.} + % TODO con il 2.6 sono stati aggiunti SA_NOCLDWAIT e altro, documentare Come si può notare in fig.~\ref{fig:sig_sigaction} \func{sigaction} permette -di utilizzare due forme diverse di gestore,\footnote{La possibilità è prevista +di utilizzare due forme diverse di gestore,\footnote{la possibilità è prevista dallo standard POSIX.1b, ed è stata aggiunta nei kernel della serie 2.1.x con l'introduzione dei segnali real-time (vedi sez.~\ref{sec:sig_real_time}); in precedenza era possibile ottenere alcune @@ -1931,8 +1938,8 @@ pi \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EINVAL}] Si è specificato un numero di segnale invalido. - \item[\errcode{EFAULT}] Si sono specificati indirizzi non validi. + \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido. + \item[\errcode{EFAULT}] si sono specificati indirizzi non validi. \end{errlist}} \end{prototype} @@ -1994,8 +2001,8 @@ sospensione del processo lo standard POSIX ha previsto la funzione \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EINVAL}] Si è specificato un numero di segnale invalido. - \item[\errcode{EFAULT}] Si sono specificati indirizzi non validi. + \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido. + \item[\errcode{EFAULT}] si sono specificati indirizzi non validi. \end{errlist}} \end{prototype} @@ -2124,10 +2131,10 @@ Installa un nuovo stack per i segnali. errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{ENOMEM}] La dimensione specificata per il nuovo stack è minore + \item[\errcode{ENOMEM}] la dimensione specificata per il nuovo stack è minore di \const{MINSIGSTKSZ}. - \item[\errcode{EPERM}] Uno degli indirizzi non è valido. - \item[\errcode{EFAULT}] Si è cercato di cambiare lo stack alternativo mentre + \item[\errcode{EPERM}] uno degli indirizzi non è valido. + \item[\errcode{EFAULT}] si è cercato di cambiare lo stack alternativo mentre questo è attivo (cioè il processo è in esecuzione su di esso). \item[\errcode{EINVAL}] \param{ss} non è nullo e \var{ss\_flags} contiene un valore diverso da zero che non è \const{SS\_DISABLE}. @@ -2227,11 +2234,98 @@ parte l'uso di \type{sigjmp\_buf} per \param{env}, \func{longjmp}. +\subsection{Criteri di programmazione per i gestori dei segnali} +\label{sec:sig_signal_handler} -\subsection{I segnali real-time} +Abbiamo finora parlato dei gestori dei segnali come funzioni chiamate in +corrispondenza della consegna di un segnale. In realtà un gestore non può +essere una funzione qualunque, in quanto esso può essere eseguito in +corrispondenza all'interruzione in un punto qualunque del programma principale, +ed ad esempio può essere problematico chiamare all'interno di un gestore di +segnali la stessa funzione che dal segnale è stata interrotta. + +\index{funzioni~sicure|(} + +Il concetto è comunque più generale e porta ad una distinzione fra quelle che +che POSIX chiama \textsl{funzioni insicure} (\textit{n'Usane function}) e +\textsl{funzioni sicure} (\textit{safe function}); quando un segnale +interrompe una funzione insicura ed il gestore chiama al suo interno una +funzione insicura il sistema può dare luogo ad un comportamento indefinito. + +Tutto questo significa che un gestore di segnale deve essere programmato con +molta cura per evitare questa evenienza, pertanto è non è possibile chiamare +al suo interno una funzione qualunque, e si può ricorrere soltanto all'uso di +funzioni sicure. + +L'elenco delle funzioni sicure varia a secondo dello standard a cui si fa +riferimento, secondo quanto riportato dallo standard POSIX 1003.1 nella +revisione del 2003, le ``\textit{signal safe function}'' che possono essere +chiamate anche all'interno di un gestore di segnali sono quelle della lista +riportata in fig.~\ref{fig:sig_safe_functions}. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \func{\_exit}, \func{abort}, \func{accept}, \func{access}, + \func{aio\_error} \func{aio\_return}, \func{aio\_suspend}, \func{alarm}, + \func{bind}, \func{cfgetispeed}, \func{cfgetospeed}, \func{cfsetispeed}, + \func{cfsetospeed}, \func{chdir}, \func{chmod}, \func{chown}, + \func{clock\_gettime}, \func{close}, \func{connect}, \func{creat}, + \func{dup}, \func{dup2}, \func{execle}, \func{execve}, \func{fchmod}, + \func{fchown}, \func{fcntl}, \func{fdatasync}, \func{fork}, + \func{fpathconf}, \func{fstat}, \func{fsync}, \func{ftruncate}, + \func{getegid}, \func{geteuid}, \func{getgid}, \func{getgroups}, + \func{getpeername}, \func{getpgrp}, \func{getpid}, \func{getppid}, + \func{getsockname}, \func{getsockopt}, \func{getuid}, \func{kill}, + \func{link}, \func{listen}, \func{lseek}, \func{lstat}, \func{mkdir}, + \func{mkfifo}, \func{open}, \func{pathconf}, \func{pause}, \func{pipe}, + \func{poll}, \func{posix\_trace\_event}, \func{pselect}, \func{raise}, + \func{read}, \func{readlink}, \func{recv}, \func{recvfrom}, + \func{recvmsg}, \func{rename}, \func{rmdir}, \func{select}, + \func{sem\_post}, \func{send}, \func{sendmsg}, \func{sendto}, + \func{setgid}, \func{setpgid}, \func{setsid}, \func{setsockopt}, + \func{setuid}, \func{shutdown}, \func{sigaction}, \func{sigaddset}, + \func{sigdelset}, \func{sigemptyset}, \func{sigfillset}, + \func{sigismember}, \func{signal}, \func{sigpause}, \func{sigpending}, + \func{sigprocmask}, \func{sigqueue}, \func{sigset}, \func{sigsuspend}, + \func{sleep}, \func{socket}, \func{socketpair}, \func{stat}, + \func{symlink}, \func{sysconf}, \func{tcdrain}, \func{tcflow}, + \func{tcflush}, \func{tcgetattr}, \func{tcgetgrp}, \func{tcsendbreak}, + \func{tcsetattr}, \func{tcsetpgrp}, \func{time}, \func{timer\_getoverrun}, + \func{timer\_gettime}, \func{timer\_settime}, \func{times}, \func{umask}, + \func{uname}, \func{unlink}, \func{utime}, \func{wait}, \func{waitpid}, + \func{write}. + \end{minipage} + \normalsize + \caption{Elenco delle funzioni sicure secondo lo standard POSIX + 1003.1-2003.} + \label{fig:sig_safe_functions} +\end{figure} + +\index{funzioni~sicure|)} + +Per questo motivo è opportuno mantenere al minimo indispensabile le operazioni +effettuate all'interno di un gestore di segnali, qualora si debbano compiere +operazioni complesse è sempre preferibile utilizzare la tecnica in cui si usa +il gestore per impostare il valore di una qualche variabile globale, e poi si +eseguono le operazioni complesse nel programma verificando (con tutti gli +accorgimenti visti in precedenza) il valore di questa variabile tutte le volte +che si è rilevata una interruzione dovuta ad un segnale. + + +\section{Funzionalità avanzate} \label{sec:sig_real_time} +Tratteremo in questa ultima sezione alcune funzionalità avanzate relativa ai +segnali ed in generale ai meccanismi di notifica, a partire dalla funzioni +introdotte per la gestione dei cosiddetti ``\textsl{segnali real-time}'', alla +gestione avanzata delle temporizzazioni e le nuove interfacce per la gestione +di segnali ed eventi attraverso l'uso di filedescriptor. + +\subsection{I segnali real-time} +\label{sec:sig_real_time} + Lo standard POSIX.1b, nel definire una serie di nuove interfacce per i servizi real-time, ha introdotto una estensione del modello classico dei segnali che presenta dei significativi miglioramenti,\footnote{questa estensione è stata @@ -2343,12 +2437,12 @@ funzione, \funcd{sigqueue}, il cui prototipo \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EAGAIN}] La coda è esaurita, ci sono già \const{SIGQUEUE\_MAX} - segnali in attesa si consegna. - \item[\errcode{EPERM}] Non si hanno privilegi appropriati per inviare il + \item[\errcode{EAGAIN}] la coda è esaurita, ci sono già + \const{SIGQUEUE\_MAX} segnali in attesa si consegna. + \item[\errcode{EPERM}] non si hanno privilegi appropriati per inviare il segnale al processo specificato. - \item[\errcode{ESRCH}] Il processo \param{pid} non esiste. - \item[\errcode{EINVAL}] Si è specificato un valore non valido per + \item[\errcode{ESRCH}] il processo \param{pid} non esiste. + \item[\errcode{EINVAL}] si è specificato un valore non valido per \param{signo}. \end{errlist} ed inoltre \errval{ENOMEM}.} @@ -2367,8 +2461,8 @@ installato un gestore con \const{SA\_SIGINFO} e ci sono risorse disponibili, sez.~\ref{sec:sys_limits}; il suo valore minimo secondo lo standard, \const{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32. Nel caso di Linux questo è uno dei parametri del kernel impostabili sia con \func{sysctl}, che scrivendolo - direttamente in \file{/proc/sys/kernel/rtsig-max}, il valore predefinito è - di 1024.} nella coda dei segnali real-time) esso viene inserito e diventa + direttamente in \procfile{/proc/sys/kernel/rtsig-max}, il valore predefinito + è di 1024.} nella coda dei segnali real-time) esso viene inserito e diventa pendente; una volta consegnato riporterà nel campo \var{si\_code} di \struct{siginfo\_t} il valore \const{SI\_QUEUE} e il campo \var{si\_value} riceverà quanto inviato con \param{value}. Se invece si è installato un @@ -2388,8 +2482,8 @@ meccanismi di comunicazione elementare; la prima di queste funzioni \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EINTR}] La funzione è stata interrotta. - \item[\errcode{EINVAL}] Si è specificato un valore non valido per + \item[\errcode{EINTR}] la funzione è stata interrotta. + \item[\errcode{EINVAL}] si è specificato un valore non valido per \param{set}. \end{errlist} ed inoltre \errval{EFAULT}.} @@ -2434,7 +2528,7 @@ relativi prototipi sono: errore, nel qual caso \var{errno} assumerà uno dei valori già visti per \func{sigwait}, ai quali si aggiunge, per \func{sigtimedwait}: \begin{errlist} - \item[\errcode{EAGAIN}] Si è superato il timeout senza che un segnale atteso + \item[\errcode{EAGAIN}] si è superato il timeout senza che un segnale atteso fosse emesso. \end{errlist} } @@ -2465,6 +2559,21 @@ questa maniera devono essere mascherati per tutti i thread, compreso quello dedicato alla gestione, che potrebbe riceverlo fra due chiamate successive. +\subsection{La gestione avanzata delle temporizzazioni} +\label{sec:sig_timer_adv} + + + + +\subsection{Le interfacce per la notifica attraverso i file descriptor} +\label{sec:sig_signalfd_eventfd} + + +% TODO trattare qui eventfd signalfd e timerfd introdotte con il 2.6.22 +% vedi: http://lwn.net/Articles/233462/ +% http://lwn.net/Articles/245533/ + + % LocalWords: kernel POSIX timer shell control ctrl kill raise signal handler % LocalWords: reliable unreliable fig race condition sez struct process table % LocalWords: delivered pending scheduler sigpending l'I suspend SIGKILL wait @@ -2495,8 +2604,20 @@ dedicato alla gestione, che potrebbe riceverlo fra due chiamate successive. % LocalWords: how oldset BLOCK UNBLOCK SETMASK sigsuspend sigaltstack malloc % LocalWords: SIGSTKSZ MINSIGSTKSZ ss oss ENOMEM flags DISABLE sp setrlimit LB % LocalWords: RLIMIT rlim sigsetjmp siglongjmp sigjmp buf env savesigs jmp ptr -% LocalWords: SIGRTMIN SIGRTMAX sigval sigevent sigqueue EAGAIN sysctl -% LocalWords: QUEUE thread sigwait sigwaitinfo sigtimedwait info DEF SLB +% LocalWords: SIGRTMIN SIGRTMAX sigval sigevent sigqueue EAGAIN sysctl safe +% LocalWords: QUEUE thread sigwait sigwaitinfo sigtimedwait info DEF SLB bind +% LocalWords: function accept return cfgetispeed cfgetospeed cfsetispeed chdir +% LocalWords: cfsetospeed chmod chown gettime close connect creat dup execle +% LocalWords: execve fchmod fchown fdatasync fpathconf fstat fsync ftruncate +% LocalWords: getegid geteuid getgid getgroups getpeername getpgrp getppid sem +% LocalWords: getsockname getsockopt getuid listen lseek lstat mkdir mkfifo +% LocalWords: pathconf poll posix pselect read readlink recv recvfrom recvmsg +% LocalWords: rename rmdir select send sendmsg sendto setgid setpgid setsid +% LocalWords: setsockopt setuid shutdown sigpause socketpair stat symlink +% LocalWords: sysconf tcdrain tcflow tcflush tcgetattr tcgetgrp tcsendbreak +% LocalWords: tcsetattr tcsetpgrp getoverrun times umask uname unlink utime +% LocalWords: write sival + %%% Local Variables: %%% mode: latex