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