int main(int argc, char *argv[], char *envp[])
{
...
- /* create two pipes to handle process communication */
+ /* create two pipes, pipein and pipeout, to handle communication */
if ( (retval = pipe(pipein)) ) {
WriteMess("input pipe creation error");
exit(0);
dup2(pipein[0], STDIN_FILENO); /* remap stdin to pipe read end */
close(pipeout[0]);
dup2(pipeout[1], STDOUT_FILENO); /* remap stdout in pipe output */
- execlp("barcode", "barcode", size, NULL); //"-o", "-", NULL);
+ execlp("barcode", "barcode", size, NULL);
}
close(pipein[0]); /* close input side of input pipe */
write(pipein[1], argv[1], strlen(argv[1])); /* write parameter to pipe */
close(pipein[1]); /* closing write end */
waitpid(pid, NULL, 0); /* wait child completion */
/* Second fork: use child to run ghostscript */
- if ( (pid = fork()) == -1) { /* on error exit */
+ if ( (pid = fork()) == -1) {
WriteMess("child creation error");
exit(0);
}
le due pipe che serviranno per la comunicazione fra i due comandi utilizzati
per produrre il codice a barre; si ha cura di controllare la riuscita della
chiamata, inviando in caso di errore un messaggio invece dell'immagine
-richiesta.\footnote{la funzione \func{WriteMess}, non è riportata in
+richiesta.\footnote{la funzione \func{WriteMess} non è riportata in
\secref{fig:ipc_barcodepage_code}; essa si incarica semplicemente di
formattare l'uscita alla maniera dei CGI, aggiungendo l'opportuno
\textit{mime type}, e formattando il messaggio in HTML, in modo che
Questo però ci porta a scontrarci con una caratteristica peculiare delle pipe,
che a prima vista non è evidente. Per poter effettuare la conversione di un
PDF infatti è necessario, per la struttura del formato, dover eseguire delle
-\func{lseek} sul file da convertire; se si esegue \cmd{gs} su un file normale
+\func{lseek} sul file da convertire; se si esegue \cmd{gs} su un file regolare
non ci sono problemi, ma una pipe però è rigidamente sequenziale, ed il
tentativo di eseguire detta operazione su una pipe comporta l'immediato
fallimento con un errore di \macro{ESPIPE}. Questo ci dice che in generale la
stessa chiave due processi diversi potranno ricavare l'identificatore
associato ad un oggetto e accedervi entrambi.
-
Questa caratteristica mostra il primo dei problemi associati al sistema di IPC
di System V. Un secondo problema riguarda le modalità per l'accesso a questi
oggetti.
+
+
\subsection{Code di messaggi}
\label{sec:ipc_messque}