/* FILE pwait1.c */ #include #include #include #define MODE 0644 int procfile(char *f1) { int nread, nwrite, atteso, status, fileh, pid; char st1[80], st2[80]; if ((fileh = creat(f1, MODE)) < 0) return 1; close(fileh); fileh = open(f1, O_RDWR); printf("valore di fileh %d\n", fileh); /* apertura in lettura/scrittura */ if ((pid = fork()) < 0) { /* fork fallita */ printf("Errore in fork\n"); close(fileh); return 2; } else if (pid == 0) { /* figlio */ int s; printf("Esecuzione del figlio\n"); printf("Fornire una stringa (max 79 caratteri)\n"); scanf("%s", st1); nwrite = write(fileh, st1, strlen(st1)+1); printf("Stringa scritta %s\n", st1); printf("Numero di caratteri scritti %d\n", nwrite); exit(nwrite); } else { /* padre */ int we; atteso = wait (&status); if (atteso < 0) { printf("Errore in wait\n"); return 3; } if (WIFEXITED(status) == 0) printf("Errore in status\n"); else { printf("Per il figlio %d lo stato di EXIT e` %d\n", pid, we = WEXITSTATUS(status)); lseek(fileh, 0L, 0); nread = read(fileh, st2, we); printf("Il padre ha letto nread caratteri %d\n", nread); printf("Il padre ha letto la stringa %s\n", st2); close(fileh); return 0; } } } main (int argc, char **argv) { int integi; if (argc < 2) { printf("Errore nel numero di parametri: un argomento nome di file\n"); exit(argc); } integi = procfile(argv[1]); exit(integi); }