Oppure

Loading
29/09/14 14:40
MasterK
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:
void run_command_in_parallel_mode(struct list* cmd){
	int i; //Contatore del ciclo for
	pid_t pid; // Process identifier del processo generato con fork()
	struct node* tmp;
	tmp = cmd -> header;
	char filename[50];
	
	for(i=0; i<cmd->count; i++){ //Contatore che cicla per tutta la lunghezza della lista
		pid = fork(); // Biforcazione del processo in Padre e Figlio.
		if(pid==0){ // Il processo figlio è stato generato
			printf("\nProcesso figlio con PID %d\tPPID %d\tVALORE DELLA i %d\tESEGUE %s\n", getpid(), getppid(), i, tmp->command);
			sprintf(filename, "out.%d", i+1);
			freopen( filename, "w", stdout); // Reindirizza stdout nel file destinazione
			system(tmp -> command);
			tmp = tmp -> next;
		}else{
			printf("\nProcesso padre con PID %d e PPID %d\n", getpid(), getppid());
		}
	}
	freopen( "CON", "w", stdout ); // Ripristina stdout
}

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?
aaa
29/09/14 20:29
pierotofy
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:

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


Verrà eseguita prima che i processi terminino le chiamate a system.
Il mio blog: piero.dev
29/09/14 20:33
MasterK
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.
aaa