X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=session.tex;h=2deb5d6ed320f96f794317a208431c556496d2fb;hp=ffc69467efca3794e40114eda8a0b65bd595ee1a;hb=51e3c35a5012dba879b2cd3af28f08fddd6dc68c;hpb=c590e94a4432aec4fc9659ba68d406f3c4779e26 diff --git a/session.tex b/session.tex index ffc6946..2deb5d6 100644 --- a/session.tex +++ b/session.tex @@ -602,26 +602,31 @@ occorrer \begin{enumerate} \item Eseguire una \func{fork} e terminare immediatamente il processo padre proseguendo l'esecuzione nel figlio. In questo modo si ha la certezza che - il processo non è un \textit{process group leader}, e si può chiamare - \func{setsid} con successo. + il figlio non è un \textit{process group leader}, (avrà il \acr{pgid} del + padre, ma un \acr{pid} diverso) e si può chiamare \func{setsid} con + successo. Inoltre la shell considererà terminato il comando all'uscita del + padre. \item Eseguire \func{setsid} per creare una nuova sessione ed un nuovo - raggruppamento di cui il processo è leader, che non ha associato nessun - terminale di controllo. + raggruppamento di cui il processo diventa automaticamente il leader, che + però non ha associato nessun terminale di controllo. \item Assicurarsi che al processo non venga associato in seguito nessun nuovo terminale di controllo; questo può essere fatto sia avendo cura di usare sempre l'opzione \macro{O\_NOCTTY} nell'aprire i file di terminale, che - eseguendo una ulteriore \func{fork} proseguendo nel figlio, che a questo - punto non essendo più leader di sessione non può più ottenere un terminale - di controllo. -\item Eseguire una \func{chdir} per impostare la directory di lavoro (su - \file{/} o su una directory che contenga dei file necessari per il - programma), per evitare che la directory da cui si è lanciato il processo + eseguendo una ulteriore \func{fork} uscendo nel padre e proseguendo nel + figlio. In questo caso, non essendo più quest'ultimo un leader di sessione + non potrà ottenere automaticamente un terminale di controllo. +\item Eseguire una \func{chdir} per impostare la directory di lavoro del + processo (su \file{/} o su una directory che contenga dei file necessari per + il programma), per evitare che la directory da cui si è lanciato il processo resti in uso e non sia possibile rimuoverla o smontare il filesystem che la contiene. \item Impostare la maschera dei permessi (di solito con \code{umask(0)}) in modo da non essere dipendenti dal valore ereditato da chi ha lanciato originariamente il processo. -\item Chiudere i file standard (o redirigerli verso \file{/dev/null}). +\item Chiudere tutti i file aperti che non servono più (in generale tutti); in + particolare vanno chiusi i file standard che di norma sono ancora associati + al terminale (un'altra opzione è quella di redirigerli verso + \file{/dev/null}). \end{enumerate} @@ -637,14 +642,112 @@ prototipo valori impostati dalle sottostanti \func{fork} e \func{setsid}.} \end{prototype} -La funzione esegue una \func{fork}, per uscire subito, con \func{\_exit} nel -padre, mentre l'esecuzione prosegue nel figlio che esegue \func{setsid}. Se -\param{nochdir} è nullo la funzione imposta anche la directory di lavoro su -\file{/}, se \param{noclose} è nullo i file standard vengono rediretti su -\file{dev/null}; in caso di valori non nulli non viene eseguita nessuna altra -azione. - +La funzione esegue una \func{fork}, per uscire subito, con \func{\_exit}, nel +padre, mentre l'esecuzione prosegue nel figlio che esegue subito una +\func{setsid}. In questo modo si compiono automaticamente i passi 1 e 2 della +precedente lista. Se \param{nochdir} è nullo la funzione imposta anche la +directory di lavoro su \file{/}, se \param{noclose} è nullo i file standard +vengono rediretti su \file{/dev/null} (corrispondenti ai passi 4 e 6); in caso +di valori non nulli non viene eseguita nessuna altra azione. + +Dato che un programma demone non può più accedere al terminale, si pone il +problema di come fare per la notifica di eventuali errori, non potendosi più +utilizzare lo standard error; per il normale I/O infatti ciascun demone avrà +le sue modalità di interazione col sistema e gli utenti a seconda dei compiti +e delle funzionalità che sono sono previste; ma gli errori devono normalmente +essere notificati all'amministratore del sistema. + +Una soluzione può essere quella di scrivere gli eventuali messaggi su uno +specifico file (cosa che a volte viene fatta comunque) ma questo comporta il +grande svantaggio che l'amministratore dovrà tenere sotto controllo un file +diverso per ciascun demone, e che possono anche generarsi conflitti di nomi. +Per questo in BSD4.2 venne introdotto un servizio di sistema, il +\textit{syslog}, che oggi si trova su tutti i sistemi Unix, e che permettesse +ai demoni di inviare messaggi all'amministratore in una maniera +standardizzata. + +Il servizio prevede vari meccanismi di notifica, e, come ogni altro servizio +in un sistema unix-like, viene gestito attraverso un apposito programma, +\cmd{syslogd}, che è anch'esso un \textsl{demone}. In generale i messaggi di +errore vengono raccolti dal file speciale \file{/dev/log}, un \textit{socket} +locale (vedi \secref{sec:sock_sa_local}) dedicato a questo scopo, o via rete, +con un \textit{socket} UDP, o da un apposito demone, \cmd{klogd}, che estrae i +messaggi del kernel.\footnote{i messaggi del kernel sono tenuti in un buffer + circolare e scritti tramite la funzione \func{printk}, analoga alla + \func{printf} usata in user space; una trattazione eccellente dell'argomento + si trova in \cite{LinDevDri}, nel quarto capitolo.} + +Il servizio permette poi di trattare i vari messaggi classificandoli secondo +due indici, una \textit{facility}, che indica quale categoria di demone ha +emesso il messaggio, e permette di classificarli per sottosistemi (kernel, +posta elettronica, demoni di stampa, ecc.), ed una \textit{priority}, che +identifica l'importanza del messaggio. Il sistema di \textit{syslog} provvede +poi a riportare i messaggi all'amministratore in varie modalità come: +\begin{itemize*} +\item scriverli sulla console. +\item inviarli via mail ad uno specifico utente. +\item scriverli su un file (comunemente detto \textit{log file}). +\item inviarli ad un altro demone (anche via rete). +\item scartarli. +\end{itemize*} +secondo le modalità che questo preferisce e che possono essere impostate +attraverso il file di configurazione \file{/etc/syslog.conf} (maggiori +dettagli si possono trovare sulle relative pagine di manuale per questo file e +per \cmd{syslogd}). + +Le \acr{glibc} definiscono una serie di funzioni standard con cui un processo +può accedere in maniera generica al servizio di syslog, che però funzionano +solo localmente; se si vogliono inviare i messaggi ad un'altro sistema occorre +farlo esplicitamente con un socket UDP, o utilizzare le capacità di reinvio +del servizio. + +La prima funzione definita dall'interfaccia è \func{openlog}; essa in generale +non è necessaria per l'uso del servizio, ma permette di impostare alcuni +valori che controllano gli effetti delle chiamate successive; il suo prototipo +è: +\begin{prototype}{syslog.h}{void openlog(const char *ident, int option, +int facility)} + +Apre una connessione al sistema di \textit{syslog}. + +\bodydesc{La funzione non restituisce nulla.} +\end{prototype} +La funzione permette di specificare, tramite \param{ident}, l'identità di chi +ha inviato il messaggio (di norma si passa il nome del programma, come +specificato da \code{argv[0]}); la stringa verrà preposta all'inizio di ogni +messaggio. Il parametro \param{facility} permette invece di specificare una +categoria per classificare i vari messaggi; i valori possibili sono riportati +in \tabref{tab:sess_syslog_facility}. + + +\begin{table}[htb] +\centering +\begin{tabular}[c]{|l|p{8cm}|} +\hline +\textbf{Valore}& \textbf{Significato}\\ +\hline +\hline +\macro{LOG\_AUTH} & \\ +\macro{LOG\_AUTHPRIV} & \\ +\macro{LOG\_CRON} & \\ +\macro{LOG\_DAEMON} & \\ +\macro{LOG\_FTP} & \\ +\macro{LOG\_KERN} & \\ +\macro{LOG\_LOCAL0} & \\ +...& \\ +\macro{LOG\_LOCAL7} & \\ +\macro{LOG\_LPR} & \\ +\macro{LOG\_MAIL} & \\ +\macro{LOG\_NEWS} & \\ +\macro{LOG\_SYSLOG} & \\ +\macro{LOG\_USER} & \\ +\macro{LOG\_UUCP} & \\ +\hline +\end{tabular} +\caption{Valori possibili per l'argomento \param{facility} di \func{openlog}.} +\label{tab:sess_syslog_facility} +\end{table} \section{L'I/O su terminale}