From 1f3175061ada629be8bf1a8aa819ed0ed5f9cd3f Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Tue, 18 Jun 2002 22:11:06 +0000 Subject: [PATCH] Nuovo esempio --- ipc.tex | 6 +- sources/BarCode.c | 145 ++++++++++++++++++++++++++++++++++++++++++++++ sources/Makefile | 2 + 3 files changed, 150 insertions(+), 3 deletions(-) create mode 100644 sources/BarCode.c diff --git a/ipc.tex b/ipc.tex index 7dd8c67..21fae71 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1,4 +1,4 @@ -\chapter{La comunicazione fra processi} +f\chapter{La comunicazione fra processi} \label{cha:IPC} @@ -240,12 +240,12 @@ capi inutilizzati delle pipe (input della prima ed output della seconda), poi scrive (\texttt{\small 30}) la stringa da convertire sull'output della prima pipe così che \cmd{barcode} possa riceverla dallo standard input; a questo punto l'uso della prima pipe è finito ed essa può essere definitivamente -chiusa (\texttt{\small 31}), si attenderà poi (\texttt{\small 32}) che pure +chiusa (\texttt{\small 31}), si attenderà poi (\texttt{\small 32}) che l'esecuzione di \cmd{barcode} venga completata. Alla conclusione della sua esecuzione \cmd{barcode} avrà effettuato inviato l'immagine postscript del codice a barre sul capo in scrittura della seconda -pipe; +pipe; a questo punto diff --git a/sources/BarCode.c b/sources/BarCode.c new file mode 100644 index 0000000..138e23a --- /dev/null +++ b/sources/BarCode.c @@ -0,0 +1,145 @@ +/* BarCode.c + * + * Copyright (C) 2002 Simone Piccardi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/**************************************************************** + * + * Program echod + * CGI for barcode generation + * + * Author: Simone Piccardi + * Jun. 2002 + * + * Usage: cgi-bin for apache. + * Called by downloading something like: + * http://localhost/cgi-bin/barcode?string + * where string is the code to be converted + * + * $Id: BarCode.c,v 1.1 2002/06/18 22:11:06 piccardi Exp $ + * + ****************************************************************/ +/* + * Include needed headers + */ +#include /* predefined types */ +#include /* stat deinitiions */ +#include /* include unix standard library */ +/* */ +#include /* include standard I/O library */ +#include /* include standard library */ +#include /* include string library */ +#include /* include wait call */ +#include +#include +#include + +#include"macros.h" +void WriteMess(char *mess); + + +/* Program begin */ +int main(int argc, char *argv[], char *envp[]) +{ +/* + * Variables definition + */ + char buffer[8192]; + pid_t pid; + size_t n; + int retval; + int pipein[2]; + int pipeout[2]; + char size[]="-pA9"; + char psize[]="-sPAPERSIZE=a9"; + char content[]="Content-type: image/jpeg\n\n"; + /* + * Begin + */ + /* create two pipes to handle process communication */ + if ( (retval = pipe(pipein)) ) { + WriteMess("input pipe creation error"); + exit(0); + } + if ( (retval = pipe(pipeout)) ) { + WriteMess("output pipe creation error"); + exit(0); + } + /* fork child to run barcode program */ + pid = fork(); + if (pid == -1) { + WriteMess("child creation error"); + exit(0); + } + /* if child */ + if (pid == 0) { + /* + * Child exec barcode program, that take input (string to encode) + * from pipein, remapped to stdin, and write the output (a ppm + * image) to stdout, remapped to pipeout + */ + close(pipein[1]); /* close output side of input pipe */ + dup2(pipein[0], STDIN_FILENO); /* remap stdin in pipe input */ + close(pipeout[0]); + dup2(pipeout[1], STDOUT_FILENO); /* remap stdout in pipe output */ + execlp("barcode", "barcode", size, NULL); //"-o", "-", NULL); + } + /* + * Parent write string to pipe input and close it, + * then wait child execution and results form pipeout, + * then fork to convert ppm to gif using ppmtogif + */ + close(pipein[0]); /* close input side of input pipe */ + n=write(pipein[1], argv[1], strlen(argv[1])); + close(pipein[1]); + waitpid(pid, NULL, 0); + /* + * refork to use ppmtogif + */ + pid = fork(); + if (pid == -1) { + WriteMess("child creation error"); + exit(0); + } + /* + * second child, convert ppm to gif + */ + if (pid == 0) { + /* send mime type */ + close(pipeout[1]); + dup2(pipeout[0], STDIN_FILENO); + write(STDOUT_FILENO, content, strlen(content)); + n=read(pipeout[0], buffer, sizeof(buffer)); + printf("Letti %n di %n, %s\n", n, sizeof(buffer), buffer); + exit(0); + execlp("gs", "gs", "-q", "-sDEVICE=jpeg", "-sOutputFile=-", "-", NULL); + } + /* + * still parent + */ + close(pipeout[1]); + waitpid(pid, NULL, 0); + exit(0); +} +/* + * Routine to produce an HTML error message on output + */ +void WriteMess(char *mess) +{ + printf("Content-type: text/html\n\n"); + perror(mess); + printf("
\n"); +} diff --git a/sources/Makefile b/sources/Makefile index 7ce1d44..5579f28 100644 --- a/sources/Makefile +++ b/sources/Makefile @@ -11,6 +11,8 @@ OBJ = SockRead.o SockWrite.o FINAL = forktest errcode echo echod daytimed iterdaytimed daytime testfopen \ testren +barcode: BarCode.c + $(CC) $(CFLAGS) $^ -o $@ getparam: getparam.c $(CC) $(CFLAGS) $^ -o $@ -- 2.30.2