Ancora su fexecve/execveat
authorSimone Piccardi <piccardi@truelite.it>
Thu, 22 Aug 2019 09:59:43 +0000 (11:59 +0200)
committerSimone Piccardi <piccardi@truelite.it>
Thu, 22 Aug 2019 09:59:43 +0000 (11:59 +0200)
fileio.tex
listati/fexecve.c [new file with mode: 0644]

index b41f6bc..5444348 100644 (file)
@@ -2743,23 +2743,23 @@ descriptor al posto di un \textit{pathname}; il suo prototipo è:
   oltre a tutti gli errori già visti per \func{execve}.}
 \end{funcproto}
 
-La funzione esegue il programma contenuto nel file (su cui il chiamante abbia
-il permesso di esecuzione) corrispondente a \param{fd}; questo deve essere
-stato ottenuto aprendo il relativo eseguibile in sola lettura o con
+La funzione esegue il programma contenuto nel file (su cui il chiamante deve
+avere il permesso di esecuzione) corrispondente a \param{fd}; questo deve
+essere stato ottenuto aprendo il relativo eseguibile in sola lettura o con
 \const{O\_PATH}. Questa funzione fino al kernel 3.19 veniva realizzata nella
-\acr{glibc} usando il filesystem \file{proc} per ottenere da \param{fd} il
+\acr{glibc} usando il filesystem \file{/proc} per ottenere da \param{fd} il
 file corrispondente, in maniera analoga a quanto visto per l'esempio di
 fig.~\ref{fig:initfile}.
 
 La funzione di sistema \funcd{execveat} è stata introdotta proprio per rendere
 più sicura l'esecuzione ed evitare la necessità di avere disponibile
-\file{proc} per poter usare \func{fexecve}, il suo prototipo è:
+\file{/proc} per poter usare \func{fexecve}, il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{unistd.h}
 \fdecl{int execveat(int dirfd, const char *pathname, char *const argv[], \\
 \phantom{int execveat(}char *const envp[], int flags)}
-\fdesc{Esegue un programma.} 
+\fdesc{Esegue un programma relativo ad una directory.} 
 }
 
 {La funzione non ritorna in caso di successo e ritorna $-1$ per un errore, nel
@@ -2778,6 +2778,30 @@ più sicura l'esecuzione ed evitare la necessità di avere disponibile
 }
 \end{funcproto}
 
+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}; è
+pertanto possibile indicare il programma da eseguire sia con un
+\textit{pathname} assoluto che relativo, ed anche con un \textit{pathname}
+relativo alla directory indicata da \param{dirfd}. Inoltre usando per
+\param{flags} il valore \const{AT\_EMPTY\_PATH} si può indicare direttamente
+il file con il file descriptor \param{dirfd} ottenendo il comportamento di
+\func{fexecve}, che è equivalnente 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 è opportuno impostare sempre sullo stesso il
+flag di \textit{close-on-exec}, in modo che questo venga automaticamente
+chiuso all'esecuzione. Questo evita di consumare inutilmente un file
+descriptor (un programma non ha bisogno di un riferimento a se stesso), ma
+soprattutto evita problemi in caso di un eventuale uso ricorsivo di queste
+funzioni che potrebbe portare, restando aperto ogni volta un ulteriore file
+descriptor, all'esaurimento degli stessi.
+
+
+
+
 % TODO: manca prototipo e motivazione di fexecve, da trattare qui in quanto
 % inserita nello stesso standard e da usare con openat, vedi 
 % http://pubs.opengroup.org/onlinepubs/9699939699/toc.pdf
diff --git a/listati/fexecve.c b/listati/fexecve.c
new file mode 100644 (file)
index 0000000..d06fc7e
--- /dev/null
@@ -0,0 +1 @@
+execveat(fd, "", argv, envp, AT_EMPTY_PATH);