%% ipc.tex
%%
-%% Copyright (C) 2000-2015 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2016 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Un preambolo",
associato ad un oggetto ed accedervi. Il problema che sorge a questo punto è
come devono fare per accordarsi sull'uso di una stessa chiave. Se i processi
sono \textsl{imparentati} la soluzione è relativamente semplice, in tal caso
-infatti si può usare il valore speciale \texttt{IPC\_PRIVATE} per creare un
+infatti si può usare il valore speciale \constd{IPC\_PRIVATE} per creare un
nuovo oggetto nel processo padre, l'identificatore così ottenuto sarà
disponibile in tutti i figli, e potrà essere passato come argomento attraverso
una \func{exec}.
Se però si vogliono usare le costanti simboliche di
tab.~\ref{tab:file_mode_flags} occorrerà includere anche il file
-\headfile{sys/stat.h}; alcuni sistemi definiscono le costanti \const{MSG\_R}
-(il valore ottale \texttt{0400}) e \const{MSG\_W} (il valore ottale
+\headfile{sys/stat.h}; alcuni sistemi definiscono le costanti \constd{MSG\_R}
+(il valore ottale \texttt{0400}) e \constd{MSG\_W} (il valore ottale
\texttt{0200}) per indicare i permessi base di lettura e scrittura per il
proprietario, da utilizzare, con gli opportuni shift, pure per il gruppo e gli
altri. In Linux, visto la loro scarsa utilità, queste costanti non sono
\const{SHMMNI}, e potevano essere cambiati (come tutti gli altri limiti
relativi al \textit{SysV-IPC}) solo con una ricompilazione del kernel. A
partire dal kernel 2.4.x è possibile cambiare questi valori a sistema attivo
-scrivendo sui file \sysctlrelfiled{kernel}{shmmni},
-\sysctlrelfiled{kernel}{msgmni} e \sysctlrelfiled{kernel}{sem} di
+scrivendo sui file \sysctlrelfile{kernel}{shmmni},
+\sysctlrelfile{kernel}{msgmni} e \sysctlrelfiled{kernel}{sem} di
\file{/proc/sys/kernel} o con l'uso di \func{sysctl}.
\begin{figure}[!htb]
Questo in realtà è quanto avveniva fino ai kernel della serie 2.2, dalla serie
2.4 viene usato lo stesso fattore di moltiplicazione per qualunque tipo di
-oggetto, utilizzando il valore dalla costante \const{IPCMNI} (definita in
+oggetto, utilizzando il valore dalla costante \constd{IPCMNI} (definita in
\file{include/linux/ipc.h}), che indica il limite massimo complessivo per il
numero di tutti gli oggetti presenti nel \textit{SysV-IPC}, ed il cui default
è 32768. Si evita così il riutilizzo degli stessi numeri, e si fa sì che
Se invece si vuole creare una nuova coda di messaggi \param{flag} non può
essere nullo e deve essere fornito come maschera binaria, impostando il bit
-corrispondente al valore \const{IPC\_CREAT}. In questo caso i nove bit meno
+corrispondente al valore \constd{IPC\_CREAT}. In questo caso i nove bit meno
significativi di \param{flag} saranno usati come permessi per il nuovo
oggetto, secondo quanto illustrato in sez.~\ref{sec:ipc_sysv_access_control}.
-Se si imposta anche il bit corrispondente a \const{IPC\_EXCL} la funzione avrà
+Se si imposta anche il bit corrispondente a \constd{IPC\_EXCL} la funzione avrà
successo solo se l'oggetto non esiste già, fallendo con un errore di
\errcode{EEXIST} altrimenti.
& \textbf{Significato} \\
\hline
\hline
- \const{MSGMNI}& 16& \file{msgmni} & Numero massimo di code di
+ \constd{MSGMNI}& 16& \file{msgmni} & Numero massimo di code di
messaggi.\\
- \const{MSGMAX}& 8192& \file{msgmax} & Dimensione massima di un singolo
+ \constd{MSGMAX}& 8192& \file{msgmax} & Dimensione massima di un singolo
messaggio.\\
- \const{MSGMNB}&16384& \file{msgmnb} & Dimensione massima del contenuto di
+ \constd{MSGMNB}&16384& \file{msgmnb} & Dimensione massima del contenuto di
una coda.\\
\hline
\end{tabular}
che specifica il tipo di azione da eseguire. I valori possibili
per \param{cmd} sono:
\begin{basedescript}{\desclabelwidth{1.6cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{IPC\_STAT}] Legge le informazioni riguardo la coda nella
+\item[\constd{IPC\_STAT}] Legge le informazioni riguardo la coda nella
struttura \struct{msqid\_ds} indicata da \param{buf}. Occorre avere il
permesso di lettura sulla coda.
-\item[\const{IPC\_RMID}] Rimuove la coda, cancellando tutti i dati, con
+\item[\constd{IPC\_RMID}] Rimuove la coda, cancellando tutti i dati, con
effetto immediato. Tutti i processi che cercheranno di accedere alla coda
riceveranno un errore di \errcode{EIDRM}, e tutti processi in attesa su
funzioni di lettura o di scrittura sulla coda saranno svegliati ricevendo
il medesimo errore. Questo comando può essere eseguito solo da un processo
con \ids{UID} effettivo corrispondente al creatore o al proprietario della
coda, o all'amministratore.
-\item[\const{IPC\_SET}] Permette di modificare i permessi ed il proprietario
+\item[\constd{IPC\_SET}] Permette di modificare i permessi ed il proprietario
della coda, ed il limite massimo sulle dimensioni del totale dei messaggi in
essa contenuti (\var{msg\_qbytes}). I valori devono essere passati in una
struttura \struct{msqid\_ds} puntata da \param{buf}. Per modificare i
\end{basedescript}
A questi tre valori, che sono quelli previsti dallo standard, su Linux se ne
-affiancano altri tre (\const{IPC\_INFO}, \const{MSG\_STAT} e
-\const{MSG\_INFO}) introdotti ad uso del programma \cmd{ipcs} per ottenere le
+affiancano altri tre (\constd{IPC\_INFO}, \constd{MSG\_STAT} e
+\constd{MSG\_INFO}) introdotti ad uso del programma \cmd{ipcs} per ottenere le
informazioni generali relative alle risorse usate dalle code di
messaggi. Questi potranno essere modificati o rimossi in favore dell'uso di
\texttt{/proc}, per cui non devono essere usati e non li tratteremo.
cioè \var{message} è una propria struttura che si passa alla funzione,
\param{msgsz} dovrà essere uguale a \code{sizeof(message)-sizeof(long)}, (se
consideriamo il caso dell'esempio in fig.~\ref{fig:ipc_msbuf}, \param{msgsz}
-dovrà essere pari a \const{LENGTH}).
+dovrà essere pari a \var{LENGTH}).
Per capire meglio il funzionamento della funzione riprendiamo in
considerazione la struttura della coda illustrata in
ritorna immediatamente a meno che si sia ecceduto il valore di
\var{msg\_qbytes}, o il limite di sistema sul numero di messaggi, nel qual
caso si blocca. Se si specifica per \param{flag} il valore
-\const{IPC\_NOWAIT} la funzione opera in modalità non-bloccante, ed in questi
+\constd{IPC\_NOWAIT} la funzione opera in modalità non-bloccante, ed in questi
casi ritorna immediatamente con un errore di \errcode{EAGAIN}.
Se non si specifica \const{IPC\_NOWAIT} la funzione resterà bloccata fintanto
formato analogo a quello di fig.~\ref{fig:ipc_msbuf}. Una volta estratto, il
messaggio sarà rimosso dalla coda. L'argomento \param{msgsz} indica la
lunghezza massima del testo del messaggio (equivalente al valore del parametro
-\const{LENGTH} nell'esempio di fig.~\ref{fig:ipc_msbuf}).
+\var{LENGTH} nell'esempio di fig.~\ref{fig:ipc_msbuf}).
Se il testo del messaggio ha lunghezza inferiore a \param{msgsz} esso viene
rimosso dalla coda; in caso contrario, se \param{msgflg} è impostato a
-\const{MSG\_NOERROR}, il messaggio viene troncato e la parte in eccesso viene
+\constd{MSG\_NOERROR}, il messaggio viene troncato e la parte in eccesso viene
perduta, altrimenti il messaggio non viene estratto e la funzione ritorna con
un errore di \errcode{E2BIG}.
Il valore di \param{msgflg} permette di controllare il comportamento della
funzione, esso può essere nullo o una maschera binaria composta da uno o più
valori. Oltre al precedente \const{MSG\_NOERROR}, sono possibili altri due
-valori: \const{MSG\_EXCEPT}, che permette, quando \param{msgtyp} è positivo,
+valori: \constd{MSG\_EXCEPT}, che permette, quando \param{msgtyp} è positivo,
di leggere il primo messaggio nella coda con tipo diverso da \param{msgtyp}, e
\const{IPC\_NOWAIT} che causa il ritorno immediato della funzione quando non
ci sono messaggi sulla coda.
\textbf{Costante} & \textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{SEMMNI}& 128 & Numero massimo di insiemi di semafori.\\
- \const{SEMMSL}& 250 & Numero massimo di semafori per insieme.\\
- \const{SEMMNS}&\const{SEMMNI}*\const{SEMMSL}& Numero massimo di semafori
- nel sistema.\\
- \const{SEMVMX}& 32767 & Massimo valore per un semaforo.\\
- \const{SEMOPM}& 32 & Massimo numero di operazioni per chiamata a
- \func{semop}. \\
- \const{SEMMNU}&\const{SEMMNS}& Massimo numero di strutture di ripristino.\\
- \const{SEMUME}&\const{SEMOPM}& Massimo numero di voci di ripristino.\\
- \const{SEMAEM}&\const{SEMVMX}& Valore massimo per l'aggiustamento
- all'uscita. \\
+ \constd{SEMMNI}& 128 & Numero massimo di insiemi di semafori.\\
+ \constd{SEMMSL}& 250 & Numero massimo di semafori per insieme.\\
+ \constd{SEMMNS}&\const{SEMMNI}*\const{SEMMSL}& Numero massimo di semafori
+ nel sistema.\\
+ \constd{SEMVMX}& 32767 & Massimo valore per un semaforo.\\
+ \constd{SEMOPM}& 32 & Massimo numero di operazioni per chiamata a
+ \func{semop}. \\
+ \constd{SEMMNU}&\const{SEMMNS}& Massimo numero di strutture di ripristino.\\
+ \constd{SEMUME}&\const{SEMOPM}& Massimo numero di voci di ripristino.\\
+ \constd{SEMAEM}&\const{SEMVMX}& Valore massimo per l'aggiustamento
+ all'uscita. \\
\hline
\end{tabular}
\caption{Valori delle costanti associate ai limiti degli insiemi di
\file{sys/sem.h}, ma nelle versioni più recenti questo non avviene più in
quanto lo standard POSIX.1-2001 richiede che sia sempre definita a cura del
chiamante. In questa seconda evenienza le \acr{glibc} definiscono però la
-macro \macro{\_SEM\_SEMUN\_UNDEFINED} che può essere usata per controllare la
+macro \macrod{\_SEM\_SEMUN\_UNDEFINED} che può essere usata per controllare la
situazione.
Come già accennato sia il comportamento della funzione che il numero di
\var{sem\_ctime}. L'\ids{UID} effettivo del processo deve corrispondere o
al creatore o al proprietario dell'insieme, o all'amministratore.
L'argomento \param{semnum} viene ignorato.
-\item[\const{GETALL}] Restituisce il valore corrente di ciascun semaforo
+\item[\constd{GETALL}] Restituisce il valore corrente di ciascun semaforo
dell'insieme (corrispondente al campo \var{semval} di \struct{sem}) nel
vettore indicato da \param{arg.array}. Occorre avere il permesso di lettura.
L'argomento \param{semnum} viene ignorato.
-\item[\const{GETNCNT}] Restituisce come valore di ritorno della funzione il
+\item[\constd{GETNCNT}] Restituisce come valore di ritorno della funzione il
numero di processi in attesa che il semaforo \param{semnum} dell'insieme
\param{semid} venga incrementato (corrispondente al campo \var{semncnt} di
\struct{sem}). Va invocata con tre argomenti. Occorre avere il permesso di
lettura.
-\item[\const{GETPID}] Restituisce come valore di ritorno della funzione il
+\item[\constd{GETPID}] Restituisce come valore di ritorno della funzione il
\ids{PID} dell'ultimo processo che ha compiuto una operazione sul semaforo
\param{semnum} dell'insieme \param{semid} (corrispondente al campo
\var{sempid} di \struct{sem}). Va invocata con tre argomenti. Occorre avere
il permesso di lettura.
-\item[\const{GETVAL}] Restituisce come valore di ritorno della funzione il il
+\item[\constd{GETVAL}] Restituisce come valore di ritorno della funzione il il
valore corrente del semaforo \param{semnum} dell'insieme \param{semid}
(corrispondente al campo \var{semval} di \struct{sem}). Va invocata con tre
argomenti. Occorre avere il permesso di lettura.
-\item[\const{GETZCNT}] Restituisce come valore di ritorno della funzione il
+\item[\constd{GETZCNT}] Restituisce come valore di ritorno della funzione il
numero di processi in attesa che il valore del semaforo \param{semnum}
dell'insieme \param{semid} diventi nullo (corrispondente al campo
\var{semncnt} di \struct{sem}). Va invocata con tre argomenti. Occorre
avere il permesso di lettura.
-\item[\const{SETALL}] Inizializza il valore di tutti i semafori dell'insieme,
+\item[\constd{SETALL}] Inizializza il valore di tutti i semafori dell'insieme,
aggiornando il campo \var{sem\_ctime} di \struct{semid\_ds}. I valori devono
essere passati nel vettore indicato da \param{arg.array}. Si devono avere i
privilegi di scrittura. L'argomento \param{semnum} viene ignorato.
-\item[\const{SETVAL}] Inizializza il semaforo \param{semnum} al valore passato
+\item[\constd{SETVAL}] Inizializza il semaforo \param{semnum} al valore passato
dall'argomento \param{arg.val}, aggiornando il campo \var{sem\_ctime} di
\struct{semid\_ds}. Si devono avere i privilegi di scrittura.
\end{basedescript}
Come per \func{msgctl} esistono tre ulteriori valori, \const{IPC\_INFO},
-\const{SEM\_STAT} e \const{SEM\_INFO}, specifici di Linux e fuori da ogni
+\constd{SEM\_STAT} e \constd{SEM\_INFO}, specifici di Linux e fuori da ogni
standard, creati specificamente ad uso del comando \cmd{ipcs}. Dato che anche
questi potranno essere modificati o rimossi, non devono essere utilizzati e
pertanto non li tratteremo.
Il campo \var{sem\_flg} è un flag, mantenuto come maschera binaria, per il
quale possono essere impostati i due valori \const{IPC\_NOWAIT} e
-\const{SEM\_UNDO}. Impostando \const{IPC\_NOWAIT} si fa si che in tutti quei
+\constd{SEM\_UNDO}. Impostando \const{IPC\_NOWAIT} si fa si che in tutti quei
casi in cui l'esecuzione di una operazione richiederebbe di porre il processo
vada nello stato di \textit{sleep}, invece di bloccarsi \func{semop} ritorni
immediatamente (abortendo così le eventuali operazioni restanti) con un errore
di gestione del segmento di memoria condivisa in relazione al sistema della
memoria virtuale.
-Il primo dei due flag è \const{SHM\_HUGETLB} che consente di richiedere la
+Il primo dei due flag è \constd{SHM\_HUGETLB} che consente di richiedere la
creazione del segmento usando una \textit{huge page}, le pagine di memoria di
grandi dimensioni introdotte con il kernel 2.6 per ottimizzare le prestazioni
nei sistemi più recenti che hanno grandi quantità di memoria. L'operazione è
portabile.
Il secondo flag aggiuntivo, introdotto a partire dal kernel 2.6.15, è
-\const{SHM\_NORESERVE}, ed ha lo stesso scopo del flag \const{MAP\_NORESERVE}
+\constd{SHM\_NORESERVE}, ed ha lo stesso scopo del flag \const{MAP\_NORESERVE}
di \func{mmap} (vedi sez.~\ref{sec:file_memory_map}): non vengono riservate
delle pagine di swap ad uso del meccanismo del \textit{copy on write} per
mantenere le modifiche fatte sul segmento. Questo significa che caso di
& \textbf{Significato} \\
\hline
\hline
- \const{SHMALL}& 0x200000&\sysctlrelfile{kernel}{shmall}
- & Numero massimo di pagine che
- possono essere usate per i segmenti di
- memoria condivisa.\\
- \const{SHMMAX}&0x2000000&\sysctlrelfile{kernel}{shmmax}
- & Dimensione massima di un segmento di memoria
- condivisa.\\
- \const{SHMMNI}& 4096&\sysctlrelfile{kernel}{msgmni}
- & Numero massimo di segmenti di memoria condivisa
+ \constd{SHMALL}& 0x200000&\sysctlrelfiled{kernel}{shmall}
+ & Numero massimo di pagine che
+ possono essere usate per i segmenti di
+ memoria condivisa.\\
+ \constd{SHMMAX}&0x2000000&\sysctlrelfiled{kernel}{shmmax}
+ & Dimensione massima di un segmento di memoria
+ condivisa.\\
+ \constd{SHMMNI}& 4096&\sysctlrelfiled{kernel}{shmmni}
+ & Numero massimo di segmenti di memoria condivisa
presenti nel kernel.\\
- \const{SHMMIN}& 1& --- & Dimensione minima di un segmento di
- memoria condivisa.\\
- \const{SHMLBA}&\const{PAGE\_SIZE}&--- & Limite inferiore per le dimensioni
- minime di un segmento (deve essere
- allineato alle dimensioni di una
- pagina di memoria).\\
- \const{SHMSEG}& --- & --- & Numero massimo di segmenti di
- memoria condivisa per ciascun
- processo (l'implementazione non
- prevede l'esistenza di questo
- limite).\\
+ \constd{SHMMIN}& 1& --- & Dimensione minima di un segmento di
+ memoria condivisa.\\
+ \constd{SHMLBA}&\const{PAGE\_SIZE}&--- & Limite inferiore per le dimensioni
+ minime di un segmento (deve essere
+ allineato alle dimensioni di una
+ pagina di memoria).\\
+ \constd{SHMSEG}& --- & --- & Numero massimo di segmenti di
+ memoria condivisa per ciascun
+ processo (l'implementazione non
+ prevede l'esistenza di questo
+ limite).\\
\hline
si ha a cuore la portabilità. Questi comandi aggiuntivi sono:
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{SHM\_LOCK}] Abilita il \textit{memory locking} sul segmento di
+\item[\constd{SHM\_LOCK}] Abilita il \textit{memory locking} sul segmento di
memoria condivisa, impedendo che la memoria usata per il segmento venga
salvata su disco dal meccanismo della memoria virtuale. Come illustrato in
sez.~\ref{sec:proc_mem_lock} fino al kernel 2.6.9 solo l'amministratore
2.6.10 anche gli utenti normali possono farlo fino al limite massimo
determinato da \const{RLIMIT\_MEMLOCK} (vedi
sez.~\ref{sec:sys_resource_limit}).
-\item[\const{SHM\_UNLOCK}] Disabilita il \textit{memory locking} sul segmento
+\item[\constd{SHM\_UNLOCK}] Disabilita il \textit{memory locking} sul segmento
di memoria condivisa. Fino al kernel 2.6.9 solo l'amministratore poteva
utilizzare questo comando in corrispondenza di un segmento da lui bloccato.
\end{basedescript}
A questi due, come per \func{msgctl} e \func{semctl}, si aggiungono tre
-ulteriori valori, \const{IPC\_INFO}, \const{MSG\_STAT} e \const{MSG\_INFO},
+ulteriori valori, \const{IPC\_INFO}, \constd{SHM\_STAT} e \constd{SHM\_INFO},
introdotti ad uso del programma \cmd{ipcs} per ottenere le informazioni
generali relative alle risorse usate dai segmenti di memoria condivisa. Dato
che potranno essere modificati o rimossi in favore dell'uso di \texttt{/proc},
\const{SHM\_RDONLY} e \const{SHM\_REMAP} che vanno combinate con un OR
aritmetico.
-Specificando \const{SHM\_RND} si evita che \func{shmat} ritorni un errore
+Specificando \constd{SHM\_RND} si evita che \func{shmat} ritorni un errore
quando \param{shmaddr} non è allineato ai confini di una pagina. Si può quindi
usare un valore qualunque per \param{shmaddr}, e il segmento verrà comunque
agganciato, ma al più vicino multiplo di \const{SHMLBA}; il nome della
costante sta infatti per \textit{rounded}, e serve per specificare un
indirizzo come arrotondamento.
-L'uso di \const{SHM\_RDONLY} permette di agganciare il segmento in sola
+L'uso di \constd{SHM\_RDONLY} permette di agganciare il segmento in sola
lettura (si ricordi che anche le pagine di memoria hanno dei permessi), in tal
caso un tentativo di scrivere sul segmento comporterà una violazione di
accesso con l'emissione di un segnale di \signal{SIGSEGV}. Il comportamento
\var{shm\_perm}), non è prevista la possibilità di agganciare un segmento in
sola scrittura.
-Infine \const{SHM\_REMAP} è una estensione specifica di Linux (quindi non
+Infine \constd{SHM\_REMAP} è una estensione specifica di Linux (quindi non
portabile) che indica che la mappatura del segmento deve rimpiazzare ogni
precedente mappatura esistente nell'intervallo iniziante
all'indirizzo \param{shmaddr} e di dimensione pari alla lunghezza del
segmento. In condizioni normali questo tipo di richiesta fallirebbe con un
errore di \errval{EINVAL}. Ovviamente usando \const{SHM\_REMAP}
-l'argomento \param{shmaddr} non può essere nullo.
+l'argomento \param{shmaddr} non può essere nullo.
In caso di successo la funzione \func{shmat} aggiorna anche i seguenti campi
della struttura \struct{shmid\_ds}:
\item[\sysctlfiled{fs/mqueue/msg\_max}] Indica il valore massimo del numero di
messaggi in una coda e agisce come limite superiore per il valore di
\var{attr->mq\_maxmsg} in \func{mq\_open}. Il suo valore di default è 10. Il
- valore massimo è \const{HARD\_MAX} che vale \code{(131072/sizeof(void *))},
+ valore massimo è \constd{HARD\_MAX} che vale \code{(131072/sizeof(void *))},
ed il valore minimo 1 (ma era 10 per i kernel precedenti il 2.6.28). Questo
limite viene ignorato per i processi con privilegi amministrativi (più
precisamente con la \textit{capability} \const{CAP\_SYS\_RESOURCE}) ma
\fhead{time.h}
\fdecl{int mq\_timedsend(mqd\_t mqdes, const char *msg\_ptr, size\_t
msg\_len, \\
-\phantom{int mq\_timedsend(}unsigned int msg\_prio, const struct timespec *abs\_timeout)}
+\phantom{int mq\_timedsend(}unsigned int msg\_prio, const struct timespec
+*abs\_timeout)}
\fdesc{Esegue l'inserimento di un messaggio su una coda entro un tempo
specificato}
}
quindi saranno riletti per primi. A parità del valore della priorità il
messaggio sarà inserito in coda a tutti quelli che hanno la stessa priorità
che quindi saranno letti con la politica di una \textit{fifo}. Il valore della
-priorità non può eccedere il limite di sistema \const{MQ\_PRIO\_MAX}, che al
+priorità non può eccedere il limite di sistema \constd{MQ\_PRIO\_MAX}, che al
momento è pari a 32768.
Qualora la coda sia piena, entrambe le funzioni si bloccano, a meno che non
Il filesystem riconosce, oltre quelle mostrate, le opzioni \texttt{uid} e
\texttt{gid} che identificano rispettivamente utente e gruppo cui assegnarne
la titolarità, e \texttt{nr\_blocks} che permette di specificarne la
-dimensione in blocchi, cioè in multipli di \const{PAGECACHE\_SIZE} che in
+dimensione in blocchi, cioè in multipli di \constd{PAGECACHE\_SIZE} che in
questo caso è l'unità di allocazione elementare.
La funzione che permette di aprire un segmento di memoria condivisa POSIX, ed
\fdesc{Crea un semaforo o ne apre uno esistente.}
}
{La funzione ritorna l'indirizzo del semaforo in caso di successo e
- \const{SEM\_FAILED} per un errore, nel qual caso \var{errno} assumerà uno
+ \constd{SEM\_FAILED} per un errore, nel qual caso \var{errno} assumerà uno
dei valori:
\begin{errlist}
\item[\errcode{EACCES}] il semaforo esiste ma non si hanno permessi
\item[\errcode{EEXIST}] si sono specificati \const{O\_CREAT} e
\const{O\_EXCL} ma il semaforo esiste.
\item[\errcode{EINVAL}] il valore di \param{value} eccede
- \const{SEM\_VALUE\_MAX} o il nome è solo ``\texttt{/}''.
+ \constd{SEM\_VALUE\_MAX} o il nome è solo ``\texttt{/}''.
\item[\errcode{ENAMETOOLONG}] si è utilizzato un nome troppo lungo.
\item[\errcode{ENOENT}] non si è usato \const{O\_CREAT} ed il nome
specificato non esiste.
decrementarlo con successo e proseguire.
Si tenga presente che la funzione può sempre essere interrotta da un segnale,
-nel qual caso si avrà un errore di \const{EINTR}; inoltre questo avverrà
+nel qual caso si avrà un errore di \errval{EINTR}; inoltre questo avverrà
comunque, anche qualora si fosse richiesta la gestione con la semantica BSD,
installando il gestore del suddetto segnale con l'opzione \const{SA\_RESTART}
(vedi sez.~\ref{sec:sig_sigaction}) per riavviare le \textit{system call}