Ciao!! Allora fai un po di confusione forse sulla read e la write:P
Sono funzioni che lavorano a basso livello...scrivono e leggono file binari!
quando dici ho provato a scrivere in un file il valore 5 e a leggerlo con la read ...non accade cio' che pensi!...ovvero il 5 letto dalla read non viene interpretato come il valore 5 che hai digitato e di
conseguenza all'indirizzo &n viene fornito un altro valore!
Inoltre bisogna comprendere bene i parametri da passare alle due funzioni!
il terzo parametro rappresenta il numero di byte che vengono scritti e letti.. nella write utilizzi n
che potrebbe anche andare ma visto che sai che n e' un tipo int sarebbe meglio mettere sizeof(int)..
nella read invece scrivere buf e' un errore...ci vanno sempre il numero di byte che vai a leggere
quindi sizeof(int) perche' sai che devi leggere un valore int dal file!
write(fd, &n, sizeof(n));
read(fd, &n, buf);
ti consiglio sempre di utilizzare due interi in cui salvare i valori ritornati dalle due funzioni per
controllare che la lettura e scrittura siano andate a buon fine e che non ci siano stati problemi...!
Poi quando crei il file e scrivi il valore devi chiuderlo prima di leggerlo...per salvare le modifiche apportate!...poi il file sara' pronto per essere letto!
Devi includere anche <sys/wait.h> per la wait e la waitpid.
Qui ti posto il codice ...ho aggiunto qualke controllo in piu'!
/* Scrivere un programma C in cui un processo crea un file nipoti.txt e vi
scrive un intero n. A questo punto il processo attiva un processo figlio
che legge dal file n e crea a sua volta n figli e ne attende la
terminazione (di tutti). */
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h> // per la waitpid
#include<stdlib.h> // per la exit
int main() {
/* Variabili da utilizzare */
int n, pid, fd, statusN, statusF, i, waitVn, waitVf, nwrite, nread;
// nwrite e nread numero elementi effettivamente scritti/letti da write/read
// waitVn per la wait nipoti, waitVf per la wait figlio
int pidN; // riferito ai nipoti ..ma va bene anche usare sempre pid
n = 5;
/* il processo crea il file. In questo modo il file sarà disponibile
per tutti i figli, a patto che non vengano eseguiti Context-Switch */
fd = open("./nipoti", O_CREAT | O_RDWR | O_TRUNC, 0777);
if(fd < 0)
{
perror("\nUnable Create File..");
exit(EXIT_FAILURE);
}
/* Viene quindi scritto il numero di processi da creare.
N.B. la traccia chiede solamente di scrivere un numero, quindi in questo
caso mi sono preso la libertà di definirlo direttamente nel codice */
nwrite = write(fd, &n, sizeof(int));
if(nwrite < 0)
{
printf("\nProblemi con la write..");
exit(EXIT_FAILURE);
}
close(fd); //chiudo il file appena creato
/* poniamo n = 0 solo per assicurarci che il suo valore iniziale 5
non venga successivamente utlizzato. il suo valore deve essere
infatti letto dal file nipoti.txt */
n = 0;
/* Quindi si crea il Figlio */
pid = fork();
/* Si controlla che tutto sia andato secondo i piani */
if(pid < 0)
{
perror("\nUnable To Fork!"); // stampa anche il valore della variabile errno
exit(EXIT_FAILURE);
}
else if(pid == 0)
{ /* eseguito dal figlio */
int md;
md = open("./nipoti", O_RDONLY);
if(md < 0)
{
printf("\nImpossibile aprire il file...");
exit(EXIT_FAILURE);
}
printf("\n\nFiglio(%d) con padre(%d) creato!\n",getpid(), getppid());
nread = read(md, &n, sizeof(int)); /// il terzo parametro deve indicare i byte letti!
if(nread < 0)
{
printf("\nErrore nella read");
exit(EXIT_FAILURE);
}
close(md); // chiudo il file non serve piu'
printf("(DEBUG: n vale %d)\n", n);
//controllo valore n
if(n <= 0)
{
printf("Bisogna specificare un numero > 0\n");
exit(EXIT_FAILURE);
}
printf("\nCREO I NIPOTI....\n");
for(i = 0; i < n; i++)
{
/* Ora creiamo i nipoti */
pidN = fork();
if(pidN== 0)
{
printf("\nNipote(%d) con padre(%d) creato!\n",getpid(),getppid());
i = n;
}else if( pidN < 0)
{
perror("\nUnable To Fork (nipote)");
exit(EXIT_FAILURE);
}
}//fine for nipoti
/* il figlio attende che i nipoti termino*/
for(i=0; i< n; i++)
{
waitVn = wait(&statusN);
if(waitVn > 0)
printf("\n--Nipote(%d) terminato!--\n", waitVn);
}//fine for attesa nipoti */
} if(pid> 0){ /* eseguito dal padre */
waitVf = waitpid(pid, &statusF, 0);
if(waitVf > 0)
printf("*****Figlio(%d) terminato!*****\n", pid);
}//fine else
return 0;
}