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?