La seconda versione della funzione, \func{epoll\_create1} è stata introdotta
come estensione della precedente (è disponibile solo a partire dal kernel
2.6.27) per poter passare dei flag di controllo come maschera binaria in fase
-di creazione del file descriptor. Al momento l'unico valore legale
-per \param{flags} (a parte lo zero) è \constd{EPOLL\_CLOEXEC}, che consente di
+di creazione del file descriptor. Al momento l'unico valore legale per
+\param{flags} (a parte lo zero) è \constd{EPOLL\_CLOEXEC}, che consente di
impostare in maniera atomica sul file descriptor il flag di
-\textit{close-on-exec} (si è trattato il significato di \const{O\_CLOEXEC} in
-sez.~\ref{sec:file_open_close}), senza che sia necessaria una successiva
+\textit{close-on-exec} (vedi sez.~\ref{sec:proc_exec} e
+sez.~\ref{sec:file_shared_access}) senza che sia necessaria una successiva
chiamata a \func{fcntl}.
Una volta ottenuto un file descriptor per \textit{epoll} il passo successivo è
un sistema unix-like anche con altre \textit{system call}; in particolare esso
resta aperto (come ogni altro file descriptor) attraverso una chiamata ad
\func{exec}, a meno che non lo si sia creato con il flag di
-\const{SFD\_CLOEXEC} o si sia successivamente impostato il
+\const{SFD\_CLOEXEC} o si sia successivamente impostato il
\textit{close-on-exec} con \func{fcntl}. Questo comportamento corrisponde
anche alla ordinaria semantica relativa ai segnali bloccati, che restano
pendenti attraverso una \func{exec}.
automatica della posizione sul file fra padre e figlio che occorre tenere
presente.
+\itindbeg{close-on-exec}
+
Si noti inoltre che in questo caso anche i flag di stato del file, essendo
mantenuti nella struttura \kstruct{file} della \textit{file table}, vengono
condivisi, per cui una modifica degli stessi con \func{fcntl} (vedi
sez.~\ref{sec:file_fcntl_ioctl}) si applicherebbe a tutti processi che
condividono la voce nella \textit{file table}. Ai file però sono associati
-anche altri flag, dei quali l'unico usato al momento è \constd{FD\_CLOEXEC},
-detti \itindex{file~descriptor~flags} \textit{file descriptor flags}; questi
-invece sono mantenuti in \kstruct{file\_struct}, e perciò sono locali per
-ciascun processo e non vengono modificati dalle azioni degli altri anche in
-caso di condivisione della stessa voce della \textit{file table}.
+anche altri flag detti \itindex{file~descriptor~flags} \textit{file descriptor
+ flags}. Questi invece sono mantenuti in \kstruct{file\_struct}, e perciò
+sono locali per ciascun processo e non vengono modificati dalle azioni degli
+altri anche in caso di condivisione della stessa voce della \textit{file
+ table}; l'unico usato al momento è quello di \textit{close-on-exec} che
+indica che il file descriptor deve essere chiuso in una \func{exec} (vedi
+sez.~\ref{sec:proc_exec}).
+
+\itindend{close-on-exec}
Si tenga presente dunque che in un sistema unix-like è sempre possibile per
più processi accedere in contemporanea allo stesso file e che non esistono, a
suo \textit{file descriptor flag} indipendente. A questo proposito deve essere
tenuto presente che nel caso in cui si usi \func{dup} per duplicare un file
descriptor, se questo ha il flag di \textit{close-on-exec} attivo (vedi
-sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl_ioctl}), questo verrà
+sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_shared_access}), questo verrà
cancellato nel file descriptor restituito come copia.
L'uso principale di questa funzione è nella shell per la redirezione dei file
La funzione segue la sintassi delle \textit{at-functions} per indicare il file
da eseguire, e per il resto si comporta esattamente con come \func{execve} (le
cui caratteristiche sono già state illustrate in
-sez.~\ref{sec:file_stat}). Diventa così possibile indicare il programma da
+sez.~\ref{sec:proc_exec}). Diventa così possibile indicare il programma da
eseguire sia con un \textit{pathname} assoluto che relativo (usando
\const{AT\_FDCWD} come \param{dirfd}), oppure con un \textit{pathname}
relativo alla directory indicata da \param{dirfd}. In quest'ultima forma l'uso
indicare direttamente il file da eseguire aprendolo e passandone il file
descriptor nell'argomento \param{dirfd}, ottenendo il comportamento di
\func{fexecve}; quest'ultima infatti è sostanzialmente equivalente
-all'esecuzione di: \includecodesnip{listati/fexecve.c} l'unico altro valore
-utilizzabile per \param{flags} è \const{AT\_SYMLINK\_NOFOLLOW} che fa fallire
-la funzione con un errore di \errval{ELOOP}, se il file indicato è un link
-simbolico.
+all'esecuzione di:
+\includecodesnip{listati/fexecve.c}
+l'unico altro valore utilizzabile per \param{flags} è
+\const{AT\_SYMLINK\_NOFOLLOW}, che fa fallire la funzione con un errore di
+\errval{ELOOP} se il file indicato è un link simbolico.
Quando si usano \func{execveat} o \func{fexecve} per eseguire un programma
attraverso un file descriptor è naturale impostare sullo stesso il flag di
Tutto questo però non è vero quando si vuole eseguire uno script; in tal caso
infatti (si ricordi quanto detto a questo riguardo in
-sez.~\ref{sec:file_stat}) il programma che viene effettivamente messo in
+sez.~\ref{sec:proc_exec}) il programma che viene effettivamente messo in
esecuzione è l'interprete indicato nella riga iniziale dello script, che poi
legge ed interpreta il codice da eseguire dallo script stesso. Ma se lancia lo
script usando un file descriptor su cui è attivo il flag di
{La funzione ha valori di ritorno diversi a seconda dell'operazione richiesta
in caso di successo mentre ritorna sempre $-1$ per un errore, nel qual caso
\var{errno} assumerà valori diversi che dipendono dal tipo di operazione,
- l'unico valido in generale è:
+ gli unici con signifiato generico sono:
\begin{errlist}
\item[\errcode{EBADF}] \param{fd} non è un file aperto.
+ \item[\errcode{EINVAL}] \param{cmd} non è un comando supportato dal kernel
+ corrente.
\end{errlist}
}
\end{funcproto}
o \errcode{EMFILE} se il processo ha già raggiunto il massimo numero di
descrittori consentito.
-\itindbeg{close-on-exec}
-
\item[\constd{F\_DUPFD\_CLOEXEC}] ha lo stesso effetto di \const{F\_DUPFD}, ma
in più attiva il flag di \textit{close-on-exec} sul file descriptor
duplicato, in modo da evitare una successiva chiamata con
sez.~\ref{sec:intro_gcc_glibc_std}).
\item[\constd{F\_GETFD}] restituisce il valore dei \textit{file descriptor
- flags} di \param{fd} in caso di successo o $-1$ in caso di errore, il
- terzo argomento viene ignorato. Non sono previsti errori diversi da
- \errval{EBADF}. Al momento l'unico flag usato è quello di
- \textit{close-on-exec}, identificato dalla costante \const{FD\_CLOEXEC}, che
- serve a richiedere che il file venga chiuso nella esecuzione di una
- \func{exec} (vedi sez.~\ref{sec:proc_exec}). Un valore nullo significa
- pertanto che il flag non è impostato.
+ flags} (vedi sez.~\ref{sec:file_shared_access}) di \param{fd} in caso di
+ successo o $-1$ in caso di errore, il terzo argomento viene ignorato. Non
+ sono previsti errori diversi da \errval{EBADF}. Al momento l'unico flag
+ usato è quello di \textit{close-on-exec}, identificato dalla costante
+ \const{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella
+ esecuzione di una \func{exec} (vedi sez.~\ref{sec:proc_exec}). Un valore
+ nullo significa pertanto che il flag non è impostato.
\item[\constd{F\_SETFD}] imposta il valore dei \textit{file descriptor flags}
- al valore specificato con \param{arg}, ritorna un valore nullo in caso di
- successo e $-1$ in caso di errore. Non sono previsti errori diversi da
- \errval{EBADF}. Dato che l'unico flag attualmente usato è quello di
- \textit{close-on-exec}, identificato dalla costante \const{FD\_CLOEXEC},
- tutti gli altri bit di \param{arg}, anche se impostati, vengono
- ignorati.\footnote{questo almeno è quanto avviene fino al kernel 3.2, come
- si può evincere dal codice della funzione \texttt{do\_fcntl} nel file
- \texttt{fs/fcntl.c} dei sorgenti del kernel.}
-\itindend{close-on-exec}
+ (vedi sez.~\ref{sec:file_shared_access}) al valore specificato con
+ \param{arg}, ritorna un valore nullo in caso di successo e $-1$ in caso di
+ errore. Non sono previsti errori diversi da \errval{EBADF}. Dato che l'unico
+ flag attualmente usato è quello di \textit{close-on-exec}, identificato
+ dalla costante \const{FD\_CLOEXEC}, tutti gli altri bit di \param{arg},
+ anche se impostati, vengono ignorati.\footnote{questo almeno è quanto
+ avviene fino al kernel 3.2, come si può evincere dal codice della funzione
+ \texttt{do\_fcntl} nel file \texttt{fs/fcntl.c} dei sorgenti del kernel.}
\item[\constd{F\_GETFL}] ritorna il valore dei \textit{file status flags} di
\param{fd} in caso di successo o $-1$ in caso di errore, il terzo argomento
comune dopo l'esecuzione di una \func{fork} è la seguente:
\begin{itemize*}
\item i file aperti e gli eventuali flag di \textit{close-on-exec} impostati
- (vedi sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl_ioctl});
+ (vedi sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_shared_access});
\item gli identificatori per il controllo di accesso: l'\textsl{user-ID
reale}, il \textsl{group-ID reale}, l'\textsl{user-ID effettivo}, il
\textsl{group-ID effettivo} ed i \textsl{group-ID supplementari} (vedi
\end{itemize*}
\itindbeg{close-on-exec}
-
La gestione dei file aperti nel passaggio al nuovo programma lanciato con
-\func{exec} dipende dal valore che ha il flag di \textit{close-on-exec} (vedi
-sez.~\ref{sec:file_fcntl_ioctl}) per ciascun \textit{file descriptor}. I file
-per cui è impostato vengono chiusi, tutti gli altri file restano
+\func{exec} dipende dal valore che ha il flag di \textit{close-on-exec} per
+ciascun \textit{file descriptor} (vedi sez.~\ref{sec:file_shared_access}). I
+file per cui è impostato vengono chiusi, tutti gli altri file restano
aperti. Questo significa che il comportamento predefinito è che i file restano
-aperti attraverso una \func{exec}, a meno di una chiamata esplicita a
-\func{fcntl} che imposti il suddetto flag. Per le directory, lo standard
-POSIX.1 richiede che esse vengano chiuse attraverso una \func{exec}, in genere
-questo è fatto dalla funzione \func{opendir} (vedi
+aperti attraverso una \func{exec}, a meno di non aver impostato esplicitamente
+(in apertura o con \func{fnctl}) il suddetto flag. Per le directory, lo
+standard POSIX.1 richiede che esse vengano chiuse attraverso una \func{exec},
+in genere questo è fatto dalla funzione \func{opendir} (vedi
sez.~\ref{sec:file_dir_read}) che effettua da sola l'impostazione del flag di
\textit{close-on-exec} sulle directory che apre, in maniera trasparente
all'utente.
-
\itindend{close-on-exec}
Il comportamento della funzione in relazione agli identificatori relativi al