Ho un programmino per l'Uni che deve tra le altre cose generare dei figli e far scrivere ad ognuno di questi un numero arbitrario di stringhe (minimo una) su un file di output.... il tutto usando solo le system calls di unix per l'I/O su file.
Il programma nella sua logica mi funziona perchè la stampa su stdout (per debug) è quello che mi aspetto... ma nel file di output mi trovo solo la prima stringa presente invece a video.. la cosa curiosa è che l'anteprima di KDE mi dice "1 riga, due parole, 400 e rotti caratteri".. mentre ad occhio i caratteri sono una trentina.... e se apro il file con vim trovo tutto quel che mi aspetto solo che le righe successive alla prima iniziano con una @....
Il problema, a parte questa cosa strana della @, è che non ho la certezza di quel che sto facendo.. ovvero non so se è necessario gestire in qualche modo migliore la concorrenza (e magari ora sembra funzionare perchè l'input è ristretto).
un sunto del mio codice:
codice:
main()
{
//bla bla bla
/*
Se le maschere sono giuste dovrebbe creare un file o
svuotarlo se esiste, con modalità di scrittura e
aggiornamento.
E' giusto? o ci va solo l'append senza il wronly? o che
altro?
f_out per comodità per ora è globale
*/
if((f_out = open("output",O_WRONLY|O_CREAT|O_TRUNC|O_APPEND, S_IRWXU)) < 0 ) //creo file di outupt
{
perror("Impossibile creare il file di output:");
exit(3);
}
//bla bla bla
/* genero un numero di figli variabile (la logica è già
testata e funziona).. ogni figlio invocherà un numero
variabile di volte la funzione che poi deve scrivere
l'output (una funzione che fa una lista dell'albero di una
directory)
*/
for(i=1,t=1; i<=num_proc; i++,t=t+per_proc)
{
switch(pid = fork())
{
case -1: //errore della fork
perror("Errore nella generazione dei figli: ");
exit(6);
case 0: //sezione del figlio
if(i==num_proc) per_proc = ultimo;
for(j=t;j<t+per_proc;j++)
{
get_dir(j,root_path);//seleziona la dir da analizzare
scan_dir(root_path);//analizza la dir
}
exit(0);
default:
continue;
}//fine switch
}//fine for
}//fine main
//la funzione che è chiamata da ogni figlio e che scrive in output
void scan_dir(char* root_path)
{
//bla bla bla
while((dir_entry = readdir(d_root)) != NULL)//per ogni elemento nella directory principale
{
//scarto i file speciali . e ..
//apro il file correntemente analizzato
//memorizzo il risultato di fstat su statbuf
//se la entry è un file effettuo il controllo sulla data
if(S_ISREG(statbuf.st_mode))
{
if(is_older(statbuf.st_mtime)>0) //stampa
{
sprintf(buff,"%s\n",path);
printf("%s",buff); //stampa su stdout solo per debug
if(write(f_out,buff,strlen(buff)+1)<0)
{
perror("Errore nella scrittura sul file di output.");
exit(5);
}
}
}
//Se la entry è una directory la esploro con una chiamata ricorsiva
else if(S_ISDIR(statbuf.st_mode)) scan_dir(path);
}//fine while
closedir(d_root);
}
se qualcuno ha la pazienza di darmi qualche dritta (o conferma) lo propongo per la beatificazione... ho un po' di urgenza perchè è solo una parte di una cosa più grossa e ho un collega di lavoro che mi ha bidonato e lasciato fare tutto solo.. [giusto per impietosirvi ]
TNX