Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    9

    [C] Bad file descriptor dopo la fork( )

    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?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    E' sbagliato aprire un file contemporaneamente in sola scrittura e sola lettura, oltre che insensato (cosa che tu fai specificando come flags "O_RDONLY | O_WRONLY", nella open()). Se intendevi aprire il file sia in scrittura che in lettura, il flag da usare è O_RDWR.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    9
    hai ragione.. è stato un errore di distrazione. ti ringrazio molto..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.