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:
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);
}
open_file:
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;
}
child_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);
}
parent_work:
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);
}
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?