Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Uso dei processi per eseguire comandi
Forum - C/C++ - Uso dei processi per eseguire comandi

Avatar
MasterK (Normal User)
Newbie


Messaggi: 2
Iscritto: 29/09/2014

Segnala al moderatore
Postato alle 16:40
Lunedì, 29/09/2014
Ciao a tutti,
il mio non è proprio un dubbio ma una richiesta di conferma a quello che ho scritto. Se ho fatto bene o meno.
Posto subito il codice:
Codice sorgente - presumibilmente C#

  1. void run_command_in_parallel_mode(struct list* cmd){
  2.         int i; //Contatore del ciclo for
  3.         pid_t pid; // Process identifier del processo generato con fork()
  4.         struct node* tmp;
  5.         tmp = cmd -> header;
  6.         char filename[50];
  7.        
  8.         for(i=0; i<cmd->count; i++){ //Contatore che cicla per tutta la lunghezza della lista
  9.                 pid = fork(); // Biforcazione del processo in Padre e Figlio.
  10.                 if(pid==0){ // Il processo figlio è stato generato
  11.                         printf("\nProcesso figlio con PID %d\tPPID %d\tVALORE DELLA i %d\tESEGUE %s\n", getpid(), getppid(), i, tmp->command);
  12.                         sprintf(filename, "out.%d", i+1);
  13.                         freopen( filename, "w", stdout); // Reindirizza stdout nel file destinazione
  14.                         system(tmp -> command);
  15.                         tmp = tmp -> next;
  16.                 }else{
  17.                         printf("\nProcesso padre con PID %d e PPID %d\n", getpid(), getppid());
  18.                 }
  19.         }
  20.         freopen( "CON", "w", stdout ); // Ripristina stdout
  21. }


Questa funzione prende in ingresso una lista i cui nodi contengono comandi da eseguire. Ogni processo deve eseguire un comando, e l'output di ogni comando deve essere scritto su un file di testo.
Ora, funzionare funziona, ma non sono convinto al 100% che vada bene.
Io mi faccio un for che cicla per tutta la lunghezza della lista, ad ogni ciclo faccio una biforcazione del processo con fork() e, se pid==0 vuol dire che quello è il figlio, quindi apro il file di output ed eseguo il comando con la funzione system(). Ma funziona proprio così? nel senso, è vero che i comandi vengono eseguiti in "parallelo" ognuno con un processo diverso? Oppure devo usare una funzione tipo exec per differenziare il programma che il processo esegue da quello che esegue il padre?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 22:29
Lunedì, 29/09/2014
Testo quotato


funzionare funziona



E come hai testato il programma per affermare ciò?

Ad occhio non funzionerà come desiderato, siccome fork() creerà cmd.count processi, ognuno dei quali a sua volta eseguirà cmd.count - 1 iterazioni (il che non è l'effetto desiderato). Inoltre questa riga:

Testo quotato


freopen( "CON", "w", stdout ); // Ripristina stdout



Verrà eseguita prima che i processi terminino le chiamate a system.


Il mio blog: https://piero.dev
PM Quote
Avatar
MasterK (Normal User)
Newbie


Messaggi: 2
Iscritto: 29/09/2014

Segnala al moderatore
Postato alle 22:33
Lunedì, 29/09/2014
Il codice è solo una funzione di un programma più vasto.
Con funziona intendo che lanciandolo in esecuzione esegue i comandi che inserisco e crea i file di testo out contenenti l'output.
Siccome però vorrei che ogni processo esegua un comando, vorrei capire come poterlo fare.

PM Quote