Newsgroup: it.comp.lang.c
Titolo: Copia Bad file descriptor

Ciao, mi serve un programma in C con le chiamate di sistema, che copia
un file in un altro file
Ho scritto questo file copia.c:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char ** argv){
	// fr fw due file descriptor
	int fr, fw;
	// apro fr in lettura
	fr = open(argv[1],O_RDONLY);
	// apro fw con i vari permessi
	fw = open(argv[2], O_CREAT || O_TRUNC || O_RDWR,
           S_IRUSR || S_IWUSR || S_IXUSR || S_IRGRP || S_IWGRP ||
S_IROTH);
	char *buf;
	 // size contiene la dimensione del file di lettura
	int size;
	size = lseek(fr,0,SEEK_END);
	// leggo il file di dimensione size nel buf
	read(fr,buf,size);
	// restituisce un errore nel caso legge male
	if (read(fr,buf,size)==(-1))
		{printf("Errore %s \n", strerror(errno));}
	else
		{printf("Lettura ok \n");}
	// 	scrive su un file
	write(fw,&buf,size);
	// restituisce un errore nel caso non riesce a scrivere
	if (write(fw,&buf,size)==(-1))
		{printf("Errore 2 %s\n ", strerror(errno));}
	else
		{printf("Scrittura ok \n");}
	// chiude entrambi i file
	close(fr);
	close(fw);
	return 0;
}
faccio:
gcc copia.c
./a.out copia.c tmp.c
e mi viene questo errore
Lettura ok
Errore 2 Bad file descriptor
Sapete che tipo di errore è Bad file descriptor ?

 
Comincia intanto a controllare i valori di ritorno delle due chiamate 
open...
Ciao, Alberto

AlbertoEMME ha scritto:

Da lě dovresti accorgerti che || e | NON sono lo stesso operatore
Ciao, Alberto

 Ciao, Alberto
Ora è ok :
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#define PERM 0644
#define N 2048
int main(int argc, char ** argv){
        // fr fw due file descriptor
        int fr, fw;
		int size;
        char buf[N];
		// apro fr in lettura
        fr = open(argv[1],O_RDONLY);
        // apro fw con i vari permessi
        fw = open(argv[2], O_CREAT|O_WRONLY|O_TRUNC,PERM);
        while((size=read(fr,buf, N))>0)
		write(fw,buf,size);
        // restituisce un errore nel caso legge male
		// se riesce a leggere legge
        if (read(fr,buf,N)==(-1))
                {printf("Errore %s \n", strerror(errno));}
        else
                {printf("Lettura ok \n");}
        // restituisce un errore nel caso non riesce a scrivere
		// se riesce a scrivere scrive
		 if (write(fw,buf,size)==(-1))
                {printf("Errore 2 %s\n ", strerror(errno));}
        else
                {printf("Scrittura ok \n");}
        // chiude entrambi i file
        close(fr);
        close(fw);
        return 0;
}
GRAZIE ALBERTO

 
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 wrote:

Si ma se elimino dal codice i due if  e else, non ho più controllo
sugli eventuali errori
Ci ho provato e il file di output non mi viene sporcato perchè la
lettura e scritttura viene fatta in simultanea... GIUSTO????
Ciao

 lettura e scritttura viene fatta in simultanea... GIUSTO????
Ha ragione, ma e` solo perche` esci dal ciclo con (size == 0) e quindi 
si scrivono 0 byte.
---------------------------------
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#define PERM 0644
#define N 2048
int main(int argc, char **argv)
{
   int fr, fw;
   int rsize, wsize;
   char buf[N];
   /* Apro fr in lettura */
   if ((fr = open(argv[1], O_RDONLY)) < 0) {
         printf("Errore apertura file %s: %s\n", argv[1],
		strerror(errno));
   /* Apro fw con i vari permessi */
   if ((fw = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, PERM)) < 0) {
	printf("Errore apertura file %s: %s\n", argv[2],
		strerror(errno));
   /* ciclo di lettura/scrittura con controllo risultati */
   while ((rsize = read(fr, buf, N)) > 0) {
         if ((wsize = write(fw, buf, rsize)) < 0) break;
   }
   /* controlla che non ci siano stati errori in lettura */
   if (rsize < 0) {
         printf("Errore %s \n", strerror(errno));
   } else {
         printf("Lettura ok \n");
   }
   /* controlla che non ci siano stati errori in scrittura */
   if (wsize < 0) {
         printf("Errore 2 %s\n ", strerror(errno));
   } else {
         printf("Scrittura ok \n");
   }
   /* Chiude entrambi i file */
   close(fr);
   close(fw);
   return 0;


 
	return 1;
    }
----
Quelle righe sono rimaste nella tastiera facendo cut&paste :-(


 Giovanni wrote:

Grazie tutto ok