home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.disi.unige.it
/
2015-02-11.ftp.disi.unige.it.tar
/
ftp.disi.unige.it
/
pub
/
.person
/
GianuzziV
/
SO1
/
Eexec.c
< prev
next >
Wrap
C/C++ Source or Header
|
2001-11-07
|
3KB
|
95 lines
/* Eexec.c
Processo che genera un figlio,
invia al figlio dei caratteri letti da tastiera
(terminati con EOF, cioe' ^D) e
riceve gli stessi caratteri dal figlio.
Il figlio redireziona gli standard input e output
sulle pipe di collegamento con il genitore, poi exegue
il porgramma dato come argomento.
Un esempio di programma e' il succesivo "prova.c", che
legge dei caratteri dall standard input e li scrive sullo
standard output, finche' trova il carattere '$' */
#include <stdio.h>
#include <signal.h>
void main(int argc, char ** argv, char ** envp)
{
int pid;
int pipeP[2]; /* Parent to Child */
int pipeC[2]; /* Child to Parent */
char ch;
int incount = 0, outcount = 0;
/* costruisce le pipe */
if( pipe(pipeP) < 0)
{
perror("pipeP non aperta");
exit(1);
}
if( pipe(pipeC) < 0)
{
perror("pipeC non aperta");
exit(1);
}
/* genera un processo */
switch( pid = fork() )
{
case -1:
perror("fork Error: ");
exit(1);
case 0:
/* figlio */
close(1); /* chiude stdout corrente */
dup( pipeC[1]); /* stdout --> pipeC. */
close(0); /* chiude stdin corrente */
dup( pipeP[0]); /* stdin <-- pipeP */
close( pipeP[1]);
close( pipeC[0]);
execvp(argv[1], argv + 1, envp);
perror("exec Error:");
signal(getppid(), SIGQUIT);
exit(1);
default:
/* genitore */
printf("Input per il figlio:\n");
while( read(0, &ch, 1) > 0 )
{
write(pipeP[1],&ch, 1);
incount ++;
}
ch=0330;
write(pipeP[1],&ch, 1);
close(pipeP[1]);
printf("\nRicevuto dal figlio:\n");
close(pipeC[1]);
while( read(pipeC[0], &ch, 1) == 1)
{
write(1, &ch, 1);
outcount++;
}
printf("\n\nNumero caratteri ricevuti: %d\n",incount);
printf("Numero caratteri inviati: %d\n", outcount);
return;
}
}
/* prova.c */
#include <stdio.h>
void main(int argc, char ** argv, char ** envp)
{
char ch;
int i;
do
{
scanf("%c", &ch);
printf("%c", ch);
}
while (ch!='$');
printf("\n");
}