X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=a1b36fc199c1159950d78f6c19a3935aa9d7cf13;hp=7505cadf8b33df6eaf307c521f5194850ff19346;hb=9aad56ecd71e4f36e09f001cdd30b2106beec5c4;hpb=ff2d0141751ed62ef56e5bfd226c589311b8b669 diff --git a/prochand.tex b/prochand.tex index 7505cad..a1b36fc 100644 --- a/prochand.tex +++ b/prochand.tex @@ -1051,12 +1051,12 @@ le apposite funzioni trattate in \secref{sec:sig_strsignal}. \label{sec:proc_wait4} Linux, seguendo un'estensione di BSD, supporta altre due funzioni per la -lettura dello stato di terminazione di un processo \func{wait3} e -\func{wait4}, analoghe alle precedenti ma che prevedono un ulteriore -parametro attraverso il quale il kernel può restituire al padre informazioni -sulle risorse usate dal processo terminato e dai vari figli. I prototipi di -queste funzioni, che diventano accessibili definendo la costante -\macro{\_USE\_BSD}, sono: +lettura dello stato di terminazione di un processo, analoghe alle precedenti +ma che prevedono un ulteriore parametro attraverso il quale il kernel può +restituire al padre informazioni sulle risorse usate dal processo terminato e +dai vari figli. Le due funzioni sono \funcd{wait3} e \funcd{wait4}, che +diventano accessibili definendo la macro \macro{\_USE\_BSD}; i loro prototipi +sono: \begin{functions} \headdecl{sys/times.h} \headdecl{sys/types.h} \headdecl{sys/wait.h} \headdecl{sys/resource.h} @@ -1093,7 +1093,7 @@ disco. Ci sono sei diverse versioni di \func{exec} (per questo la si è chiamata famiglia di funzioni) che possono essere usate per questo compito, in realtà (come mostrato in \figref{fig:proc_exec_relat}), sono tutte un front-end a -\func{execve}. Il prototipo di quest'ultima è: +\funcd{execve}. Il prototipo di quest'ultima è: \begin{prototype}{unistd.h} {int execve(const char *filename, char *const argv[], char *const envp[])} Esegue il programma contenuto nel file \param{filename}. @@ -1117,10 +1117,11 @@ famiglia di funzioni) che possono essere usate per questo compito, in realt interprete. \item[\errcode{ELIBBAD}] Un interprete ELF non è in un formato riconoscibile. + \item[\errcode{E2BIG}] La lista degli argomenti è troppo grande. \end{errlist} ed inoltre anche \errval{EFAULT}, \errval{ENOMEM}, \errval{EIO}, - \errval{ENAMETOOLONG}, \errval{E2BIG}, \errval{ELOOP}, \errval{ENOTDIR}, - \errval{ENFILE}, \errval{EMFILE}.} + \errval{ENAMETOOLONG}, \errval{ELOOP}, \errval{ENOTDIR}, \errval{ENFILE}, + \errval{EMFILE}.} \end{prototype} La funzione \func{exec} esegue il file o lo script indicato da @@ -1428,9 +1429,10 @@ impostati all'utente e al gruppo proprietari del file. Questo consente, per programmi in cui ci sia necessità, di dare a qualunque utente normale privilegi o permessi di un'altro (o dell'amministratore). -Come nel caso del \acr{pid} e del \acr{ppid} tutti questi identificatori -possono essere letti dal processo attraverso delle opportune funzioni, i cui -prototipi sono i seguenti: +Come nel caso del \acr{pid} e del \acr{ppid}, anche tutti questi +identificatori possono essere letti attraverso le opportune funzioni: +\funcd{getuid}, \funcd{geteuid}, \funcd{getgid} e \funcd{getegid}, i loro +prototipi sono: \begin{functions} \headdecl{unistd.h} \headdecl{sys/types.h} @@ -1488,8 +1490,8 @@ ignorarne l'esistenza, in quanto saranno del tutto equivalenti ai precedenti. \label{sec:proc_setuid} Le due funzioni che vengono usate per cambiare identità (cioè utente e gruppo -di appartenenza) ad un processo sono rispettivamente \func{setuid} e -\func{setgid}; come accennato in \secref{sec:proc_access_id} in Linux esse +di appartenenza) ad un processo sono rispettivamente \funcd{setuid} e +\funcd{setgid}; come accennato in \secref{sec:proc_access_id} in Linux esse seguono la semantica POSIX che prevede l'esistenza dell'\textit{userid salvato} e del \textit{groupid salvato}; i loro prototipi sono: \begin{functions} @@ -1583,7 +1585,7 @@ l'\textsl{userid effettivo} del processo per cedere i privilegi occorre ricorrere ad altre funzioni (si veda ad esempio \secref{sec:proc_seteuid}). -\subsection{Le funzioni \func{setreuid} e \func{setresuid}} +\subsection{Le funzioni \funcd{setreuid} e \funcd{setresuid}} \label{sec:proc_setreuid} Queste due funzioni derivano da BSD che, non supportando\footnote{almeno fino @@ -1638,7 +1640,7 @@ corrente, l'userid salvato viene automaticamente uniformato al valore dell'userid effettivo. -\subsection{Le funzioni \func{seteuid} e \func{setegid}} +\subsection{Le funzioni \funcd{seteuid} e \funcd{setegid}} \label{sec:proc_seteuid} Queste funzioni sono un'estensione allo standard POSIX.1 (ma sono comunque @@ -1666,7 +1668,7 @@ all'amministratore di impostare solo l'userid effettivo, dato che l'uso normale di \func{setuid} comporta l'impostazione di tutti gli identificatori. -\subsection{Le funzioni \func{setresuid} e \func{setresgid}} +\subsection{Le funzioni \funcd{setresuid} e \funcd{setresgid}} \label{sec:proc_setresuid} Queste due funzioni sono un'estensione introdotta in Linux dal kernel 2.1.44, @@ -1698,7 +1700,7 @@ pu lascia inalterato l'identificatore corrispondente. Per queste funzioni esistono anche due controparti che permettono di leggere -in blocco i vari identificatori: \func{getresuid} e \func{getresgid}; i loro +in blocco i vari identificatori: \funcd{getresuid} e \funcd{getresgid}; i loro prototipi sono: \begin{functions} \headdecl{unistd.h} @@ -1746,8 +1748,8 @@ file, mantenendo quelli originari per quanto riguarda tutti gli altri controlli di accesso, così che l'utente non possa inviare segnali al server NFS. -Le due funzioni usate per cambiare questi identificatori sono \func{setfsuid} -e \func{setfsgid}, ovviamente sono specifiche di Linux e non devono essere +Le due funzioni usate per cambiare questi identificatori sono \funcd{setfsuid} +e \funcd{setfsgid}, ovviamente sono specifiche di Linux e non devono essere usate se si intendono scrivere programmi portabili; i loro prototipi sono: \begin{functions} \headdecl{sys/fsuid.h} @@ -1775,15 +1777,16 @@ gruppi supplementari. Ogni processo pu gruppi supplementari in aggiunta al gruppo primario, questi vengono ereditati dal processo padre e possono essere cambiati con queste funzioni. -La funzione che permette di leggere i gruppi supplementari è \func{getgroups}; -questa funzione è definita nello standard POSIX ed il suo prototipo è: +La funzione che permette di leggere i gruppi supplementari è +\funcd{getgroups}; questa funzione è definita nello standard POSIX ed il suo +prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{unistd.h} - \funcdecl{int getgroups(int size, gid\_t list[])} Legge gli identificatori - dei gruppi supplementari del processo sul vettore \param{list} di dimensione - \param{size}. + \funcdecl{int getgroups(int size, gid\_t list[])} + + Legge gli identificatori dei gruppi supplementari. \bodydesc{La funzione restituisce il numero di gruppi letti in caso di successo e -1 in caso di fallimento, nel qual caso \var{errno} assumerà @@ -1794,38 +1797,43 @@ questa funzione minore del numero di gruppi supplementari del processo. \end{errlist}} \end{functions} -\noindent non è specificato se la funzione inserisca o meno nella lista -il groupid effettivo del processo. Se si specifica un valore di \param{size} -uguale a 0 \param{list} non viene modificato, ma si ottiene il numero di -gruppi supplementari. -Una seconda funzione, \func{getgrouplist}, può invece essere usata per +La funzione legge gli identificatori dei gruppi supplementari del processo sul +vettore \param{list} di dimensione \param{size}. Non è specificato se la +funzione inserisca o meno nella lista il groupid effettivo del processo. Se si +specifica un valore di \param{size} uguale a 0 \param{list} non viene +modificato, ma si ottiene il numero di gruppi supplementari. + +Una seconda funzione, \funcd{getgrouplist}, può invece essere usata per ottenere tutti i gruppi a cui appartiene un utente; il suo prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{grp.h} \funcdecl{int getgrouplist(const char *user, gid\_t group, gid\_t *groups, - int *ngroups)} Legge i gruppi supplementari dell'utente \param{user}. + int *ngroups)} Legge i gruppi supplementari. \bodydesc{La funzione legge fino ad un massimo di \param{ngroups} valori, restituisce 0 in caso di successo e -1 in caso di fallimento.} \end{functions} -\noindent la funzione esegue una scansione del database dei gruppi (si veda -\secref{sec:sys_user_group}) e ritorna in \param{groups} la lista di quelli a -cui l'utente appartiene. Si noti che \param{ngroups} è passato come puntatore -perché qualora il valore specificato sia troppo piccolo la funzione ritorna --1, passando indietro il numero dei gruppi trovati. + +La funzione legge i gruppi supplementari dell'utente \param{user} eseguendo +una scansione del database dei gruppi (si veda \secref{sec:sys_user_group}) e +ritorna in \param{groups} la lista di quelli a cui l'utente appartiene. Si +noti che \param{ngroups} è passato come puntatore perché qualora il valore +specificato sia troppo piccolo la funzione ritorna -1, passando indietro il +numero dei gruppi trovati. Per impostare i gruppi supplementari di un processo ci sono due funzioni, che possono essere usate solo se si hanno i privilegi di amministratore. La prima -delle due è \func{setgroups}, ed il suo prototipo è: +delle due è \funcd{setgroups}, ed il suo prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{grp.h} - \funcdecl{int setgroups(size\_t size, gid\_t *list)} Imposta i gruppi - supplementari del processo ai valori specificati in \param{list}. + \funcdecl{int setgroups(size\_t size, gid\_t *list)} + + Imposta i gruppi supplementari del processo. \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di fallimento, nel qual caso \var{errno} assumerà i valori: @@ -1833,19 +1841,25 @@ delle due \item[\errcode{EFAULT}] \param{list} non ha un indirizzo valido. \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore. \item[\errcode{EINVAL}] il valore di \param{size} è maggiore del valore - massimo (\const{NGROUPS}, che per Linux è 32). + massimo consentito. \end{errlist}} \end{functions} +La funzione imposta i gruppi supplementari del processo corrente ai valori +specificati nel vettore passato con l'argomento \param{list}, di dimensioni +date dall'argomento \param{size}. Il numero massimo di gruppi supplementari è +un parametro di sistema, che può essere ricavato con le modalità spiegate in +\secref{sec:sys_characteristics}. + Se invece si vogliono impostare i gruppi supplementari del processo a quelli di -un utente specifico, si può usare \func{initgroups} il cui prototipo è: +un utente specifico, si può usare \funcd{initgroups} il cui prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{grp.h} - \funcdecl{int initgroups(const char *user, gid\_t group)} Imposta i gruppi - supplementari del processo a quelli di cui è membro l'utente \param{user}, - aggiungendo il gruppo addizionale \param{group}. + \funcdecl{int initgroups(const char *user, gid\_t group)} + + Inizializza la lista dei gruppi supplementari. \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di fallimento, nel qual caso \var{errno} assumerà gli stessi valori di @@ -1854,13 +1868,13 @@ un utente specifico, si pu \end{functions} La funzione esegue la scansione del database dei gruppi (usualmente -\file{/etc/groups}) cercando i gruppi di cui è membro \param{user} e -costruendo una lista di gruppi supplementari a cui aggiunge \param{group}, che -poi imposta usando \func{setgroups}. -Si tenga presente che sia \func{setgroups} che \func{initgroups} non sono -definite nello standard POSIX.1 e che pertanto non è possibile utilizzarle -quando si definisce \macro{\_POSIX\_SOURCE} o si compila con il flag -\cmd{-ansi}. +\file{/etc/groups}) cercando i gruppi di cui è membro l'utente \param{user} +con cui costruisce una lista di gruppi supplementari, a cui aggiunge anche +\param{group}, infine imposta questa lista per il processo corrente usando +\func{setgroups}. Si tenga presente che sia \func{setgroups} che +\func{initgroups} non sono definite nello standard POSIX.1 e che pertanto non +è possibile utilizzarle quando si definisce \macro{\_POSIX\_SOURCE} o si +compila con il flag \cmd{-ansi}. \section{La gestione della priorità di esecuzione} @@ -2040,7 +2054,7 @@ fatto che generalmente questo viene usato per diminuire la priorit processo, come misura di cortesia nei confronti degli altri. I processi infatti vengono creati dal sistema con lo stesso valore di \var{nice} (nullo) e nessuno è privilegiato rispetto agli altri; il valore può essere modificato -solo attraverso la funzione \func{nice}, il cui prototipo è: +solo attraverso la funzione \funcd{nice}, il cui prototipo è: \begin{prototype}{unistd.h} {int nice(int inc)} Aumenta il valore di \var{nice} per il processo corrente. @@ -2065,7 +2079,7 @@ la priorit In SUSv2 la funzione ritorna il nuovo valore di \var{nice}; Linux non segue questa convenzione, e per leggere il nuovo valore occorre invece usare la -funzione \func{getpriority}, derivata da BSD, il cui prototipo è: +funzione \funcd{getpriority}, derivata da BSD, il cui prototipo è: \begin{prototype}{sys/resource.h} {int getpriority(int which, int who)} @@ -2114,7 +2128,7 @@ rilevare una condizione di errore prima della chiamata alla funzione, per verificare che essa resti uguale a zero. -Analoga a \func{getpriority} la funzione \func{setpriority} permette di +Analoga a \func{getpriority} la funzione \funcd{setpriority} permette di impostare la priorità di uno o più processi; il suo prototipo è: \begin{prototype}{sys/resource.h} {int setpriority(int which, int who, int prio)} @@ -2192,11 +2206,11 @@ di scheduling che si \end{basedescript} La funzione per impostare le politiche di scheduling (sia real-time che -ordinarie) ed i relativi parametri è \func{sched\_setscheduler}; il suo +ordinarie) ed i relativi parametri è \funcd{sched\_setscheduler}; il suo prototipo è: \begin{prototype}{sched.h} {int sched\_setscheduler(pid\_t pid, int policy, const struct sched\_param *p)} - Imposta priorità e politica di scheduling per il processo \param{pid}. + Imposta priorità e politica di scheduling. \bodydesc{La funzione ritorna la priorità in caso di successo e -1 in caso di errore, nel qual caso \var{errno} può assumere i valori: @@ -2210,10 +2224,10 @@ prototipo \end{errlist}} \end{prototype} -La funzione esegue l'impostazione per il processo specificato; un valore nullo -di \param{pid} esegue l'impostazione per il processo corrente, solo un -processo con i privilegi di amministratore può impostare delle priorità -assolute diverse da zero. La politica di scheduling è specificata +La funzione esegue l'impostazione per il processo specificato dall'argomento +\param{pid}; un valore nullo esegue l'impostazione per il processo corrente. +Solo un processo con i privilegi di amministratore può impostare delle +priorità assolute diverse da zero. La politica di scheduling è specificata dall'argomento \param{policy} i cui possibili valori sono riportati in \tabref{tab:proc_sched_policy}; un valore negativo per \param{policy} mantiene la politica di scheduling corrente. @@ -2258,12 +2272,10 @@ struct sched_param { \label{fig:sig_sched_param} \end{figure} - - Lo standard POSIX.1b prevede comunque che i due valori della massima e minima priorità statica possano essere ottenuti, per ciascuna delle politiche di -scheduling realtime, tramite le due funzioni \func{sched\_get\_priority\_max} -e \func{sched\_get\_priority\_min}, i cui prototipi sono: +scheduling realtime, tramite le due funzioni \funcd{sched\_get\_priority\_max} +e \funcd{sched\_get\_priority\_min}, i cui prototipi sono: \begin{functions} \headdecl{sched.h} @@ -2299,7 +2311,7 @@ sar nel caso che esso sia stato interrotto da un processo a priorità più alta. La priorità assoluta può essere riletta indietro dalla funzione -\func{sched\_getscheduler}, il cui prototipo è: +\funcd{sched\_getscheduler}, il cui prototipo è: \begin{prototype}{sched.h} {int sched\_getscheduler(pid\_t pid)} Legge la politica di scheduling per il processo \param{pid}. @@ -2318,9 +2330,8 @@ specificato; se \param{pid} chiamante. Se si intende operare solo sulla priorità assoluta di un processo si possono -usare le funzioni \func{sched\_setparam} e \func{sched\_getparam}, i cui +usare le funzioni \funcd{sched\_setparam} e \funcd{sched\_getparam}, i cui prototipi sono: - \begin{functions} \headdecl{sched.h} @@ -2347,7 +2358,7 @@ verificata controllando la macro \macro{\_POSIX\_PRIORITY\_SCHEDULING} che definita nell'header \file{sched.h}. L'ultima funzione che permette di leggere le informazioni relative ai processi -real-time è \func{sched\_rr\_get\_interval}, che permette di ottenere la +real-time è \funcd{sched\_rr\_get\_interval}, che permette di ottenere la lunghezza della \textit{time slice} usata dalla politica \textit{round robin}; il suo prototipo è: \begin{prototype}{sched.h} @@ -2369,7 +2380,7 @@ definizione si pu Come accennato ogni processo che usa lo scheduling real-time può rilasciare volontariamente la CPU; questo viene fatto attraverso la funzione -\func{sched\_yield}, il cui prototipo è: +\funcd{sched\_yield}, il cui prototipo è: \begin{prototype}{sched.h} {int sched\_yield(void)}