summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@luxion>2008-08-20 08:37:17 +0000
committerdakkar <dakkar@luxion>2008-08-20 08:37:17 +0000
commit3e8a7c74fe7b2adb62d86a640b6549eabe2fca9a (patch)
treeb32a37779172a4abfa1f580b707d6d79012ccb45
parentritocchi estetici (diff)
downloadintro-perl-3e8a7c74fe7b2adb62d86a640b6549eabe2fca9a.tar.gz
intro-perl-3e8a7c74fe7b2adb62d86a640b6549eabe2fca9a.tar.bz2
intro-perl-3e8a7c74fe7b2adb62d86a640b6549eabe2fca9a.zip
fine! (forse)
git-svn-id: svn://luxion/repos/intro-perl@363 fcb26f47-9200-0410-b104-b98ab5b095f3
-rw-r--r--corso.content.tex74
1 files changed, 74 insertions, 0 deletions
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}