/*************************************************************************** * * Questo esercizio mostra come eseguire fork dup ed exec per ridirigere * il comando ls su un file * ***************************************************************************/ #include #include #include #include #include #include #define DIM 1 void ctrlC(int sig){ write(1,"no ctrlc\n",9); } void ctrlCfiglio(int sig){ write(1,"figlio\n",7); } int main(){ int status; int fdPipe[2]; pipe(fdPipe); int pid = fork(); if (pid < 0) perror("Errore nella fork"); else if (pid > 0){ /* codice del padre */ signal(2,ctrlC); char buf[DIM]; int n; printf("Sono il processo padre, il mio PID=%d, mio figlio ha PID=%d\n",getpid(), pid); close(fdPipe[1]); /**/ while( (n = read(fdPipe[0],buf,DIM)) > 0 ){ write(1,buf,n); /* write(2,"letto\n",6); */ } /*attesa della terminazione del figlio*/ wait(&status); /**/ } else { /* codice del figlio */ signal(2,ctrlCfiglio); sleep(20); printf("Sono il figlio, il mio PID=%d, mio padre ha PID=%d \n", getpid(), getppid()); close(1); /* Chiudo STDOUT */ close(fdPipe[0]); dup(fdPipe[1]); execlp("ls","ls","-al",NULL); printf("questo codice verra' eseguito SOLO se la exec fallisce\n"); } }