Ciao a tutti, sto facendo un piccolo esercizio in C dove mi si chiede di lanciare un programma a cui vengono passati due percorsi di file. Una volta lanciato il programma e aperto i due file input e output, bisogna eseguire una fork in modo che il processo figlio esegua la lettura dei primi 10 byte dal file e gli ultimi 10, e li scriva in output file. Una volta completato questo lavoro, il processo padre legge il file di output e ne stampa il contenuto a video.
ho scritto queste funzioni:
MAIN:
open_file:codice:int main(int argc, char *argv[]) { if(argc != 3) { fprintf(stderr,"\n Usage: %s <fileinput> <fileoutput>", argv[0]); exit(EXIT_FAILURE); } int input = open_file(argv[1]); int output = open_file(argv[2]); pid_t pid; pid = fork(); if(pid == -1) { perror("error in fork"); exit(EXIT_FAILURE); } if(pid == 0) child_work(input, output); else parent_work(output); exit(EXIT_SUCCESS); }
child_work:codice:int open_file(char *nome) { int fd = open(nome, O_RDONLY | O_WRONLY | O_CREAT); if(fd == -1) { fprintf(stderr, "Error in open file\n"); exit(EXIT_FAILURE); } return fd; }
parent_work:codice:void child_work(int in, int out) { fprintf(stderr, "sono in child_work\n"); char *buffer = malloc(sizeof(char)*10); if(buffer == NULL) { fprintf(stderr, "error in malloc\n"); exit(EXIT_FAILURE); } if(read(input,buffer,10)==-1) { fprintf(stderr, "Error in read\n"); perror(""); exit(EXIT_FAILURE); } if(write(output,buffer,10) == -1) { fprintf(stderr, "error in write\n"); exit(EXIT_FAILURE); } if(lseek(input, -10, SEEK_END) == -1) { fprintf(stderr, "error in lseek\n"); exit(EXIT_FAILURE); } if(read(input,buffer,10) == -1) { fprintf(stderr, "Error in read\n"); exit(EXIT_FAILURE); } if(lseek(output, 11, SEEK_SET) == -1) { fprintf(stderr, "error in lseek\n"); exit(EXIT_FAILURE); } if(write(output,buffer,10) == -1) { fprintf(stderr, "error in write\n"); exit(EXIT_FAILURE); } fprintf(stderr, "Lavoro compiuto\n"); exit(EXIT_SUCCESS); }
nessun problema di compilazione, ma al momento dell'esecuzione ricevo "error in read - bad file descriptor". Come mai?? la fork non dovrebbe duplicare tutto, anche il file descriptor?codice:void parent_work(int output) { int *status; if(wait(&status) == -1) { fprintf(stderr, "error in wait\n"); exit(EXIT_FAILURE); } fprintf(stderr, "sono dopo la wait\n"); char *buffer = malloc(sizeof(char)*20); if(buffer == NULL) { fprintf(stderr, "error in malloc\n"); exit(EXIT_FAILURE); } if(lseek(output,0,SEEK_SET) == -1) { fprintf(stderr, "error in lseek\n"); exit(EXIT_FAILURE); } if(read(output,buffer,20) == -1) { fprintf(stderr, "error in read\n"); perror(""); exit(EXIT_FAILURE); } printf("Il contenuto del file letto è: %s",buffer); exit(EXIT_SUCCESS); }![]()

Rispondi quotando
