From 3e8a7c74fe7b2adb62d86a640b6549eabe2fca9a Mon Sep 17 00:00:00 2001 From: dakkar Date: Wed, 20 Aug 2008 08:37:17 +0000 Subject: fine! (forse) git-svn-id: svn://luxion/repos/intro-perl@363 fcb26f47-9200-0410-b104-b98ab5b095f3 --- corso.content.tex | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/corso.content.tex b/corso.content.tex index e4c44dc..c1870e4 100644 --- a/corso.content.tex +++ b/corso.content.tex @@ -1941,10 +1941,84 @@ while (my $file = $dir->next) { ... } \section{Processi} +\begin{frame}\frametitle{Gestione dei processi} +\begin{itemize} +\item il modello di processi usato da \Perl\ è quello UNIX +\item sotto Windows trucca un po' +\item suppongo conosciate la differenza tra {\em programma} e {\em processo} +\end{itemize} +\end{frame} + \subsection{Le funzioni} % system, exec, qx, fork/wait +\begin{frame}[fragile]\frametitle{\texttt{system}} +\begin{lstlisting} +use strict;use warnings; +use File::Temp 'tempfile'; + +my ($fh,$filename)=tempfile(); +system("gzip -dc '$ARGV[0]' > '$filename'"); +system("$ENV{EDITOR} '$filename'"); +system("gzip -c '$filename' > '$ARGV[0]'"); +\end{lstlisting} + +\lstinline!system! invoca la shell di sistema e le fa eseguire ciò che vogliamo. +\end{frame} + +\begin{frame}[fragile]\frametitle{Dettagli su \texttt{system}} +\begin{itemize} +\item \lstinline!system! restituisce il valore di uscita del processo figlio, per cui \lstinline!0! (falso) vuol dire ``successo'': \lstinline!if (system($cmd)) {errore()}! %$ +\item se la stringa passata non contiene caratteri ``strani'', la shell potrebbe non essere invocata +\item ovviamente ci sono grossi problemi di sicurezza +\item se invece di una stringa passate una lista, la shell non viene invocata (ma non potete fare redirezioni) +\end{itemize} +\end{frame} + +\begin{frame}[fragile]\frametitle{\texttt{qx}} +\begin{lstlisting} +my @lines=qx{lsusb}; +\end{lstlisting} + +\begin{itemize} +\item \lstinline!qx!, al solito, usa i delimitatori che volete +\item potete anche scriverlo \lstinline!``!, come nella shell +\item restituisce ciò che il processo figlio scrive su stdout +\item non usatelo al posto di \lstinline!system!: fanno cose diverse! +\end{itemize} +\end{frame} + +\begin{frame}[fragile]\frametitle{\texttt{fork}, \texttt{exec}, \texttt{wait}} +\begin{itemize} +\item \lstinline!fork! duplica il processo corrente: è l'unica funzione che restituisce uno scalare con due valori diversi +\item \lstinline!exec! sostituisce il programma del processo corrente: normalmente non restituisce il controllo +\item \lstinline!wait! attende il completamento di un processo figlio, restituendone il valore d'uscita +\end{itemize} + +Sono scomode da usare, meglio nascondere il tutto sotto un modulo. +\end{frame} + \subsection{Moduli da usare} % IPC::Run +\begin{frame}[fragile]\frametitle{\texttt{IPC::Run}} +Ci sono molti moduli che aiutano a gestire i processi, ma consiglio l'uso di \lstinline!IPC::Run!. + +\begin{lstlisting} +use strict;use warnings; +use File::Temp 'tempfile'; +use IPC::Run 'run'; +my ($fh,$filename)=tempfile(); +run ['gzip','-dc',$ARGV[0]], '>', $fh; +run [$ENV{EDITOR},$filename]; +run ['gzip','-c',$filename],'>',$ARGV[0]; +\end{lstlisting} + +\begin{itemize} +\item quasi come con \lstinline!system! +\item ma non tocca la shell +\item molto più flessibile, e più sicuro +\end{itemize} +\end{frame} + \section{Argomenti avanzati} \begin{frame}\frametitle{Cose non di base} -- cgit v1.2.3