Pagina 1 di 1

Aprire contemporaneamente più processi (linguaggio C).

Inviato: ven 6 apr 2012, 14:29
da NicoMetal
Vorrei fare un programma in c che mi apra n volte un altro mio programma però non nel modo "avvio il programma, aspetto che finisca e poi apro il successivo" ma ne apra molti in contemporanea o almeno non aspettando che vadano a termine. Non ho idea però da dove cominciare. qualcuno sa darmi un consiglio?
Ps.nello specifico pensavo di utilizzare l'altro programma come se fosse una funzione che poi verrà chiamato da questo main che l'aprirà n volte senza però aspettare che finisca: lancia e passa subito a lanciare quella dopo.

Re: Aprire contemporaneamente più processi (linguaggio C).

Inviato: ven 6 apr 2012, 14:58
da 414N
Dovresti ottenere quello che vuoi utilizzando fork + execXYZ (vedi man 3 exec per le varie versioni da me riassunte con XYZ) in un loop, che crei tanti sotto-processi quanti te ne servono.
Ti basterà controllare l'int ritornato dalla fork per discriminare tra processo padre (pid > 0) e processo figlio (pid = 0) in esecuzione.

Re: Aprire contemporaneamente più processi (linguaggio C).

Inviato: ven 6 apr 2012, 16:45
da NicoMetal
414N ha scritto:Dovresti ottenere quello che vuoi utilizzando fork + execXYZ (vedi man 3 exec per le varie versioni da me riassunte con XYZ) in un loop, che crei tanti sotto-processi quanti te ne servono.
Ti basterà controllare l'int ritornato dalla fork per discriminare tra processo padre (pid > 0) e processo figlio (pid = 0) in esecuzione.
In pratica io ho questo mio sorgente in c, chiamato hanoi.c (che non è altro che il gioco della torre d'hanoi). E io voglio che il mio main.c mi chiami 10 volte la funzione hanoi() che lancia il programma hanoi.c. Il tutto però senza che aspetti che la funzione vada a termine.

se io faccio :

for( i =0; i < 10; i++ ){
fork();
hanoi();
}

Non ho capito se fa quello che dico io, oppure ne lancia due, aspetta che finiscano, poi ne rilancia due, ecc.

Re: Aprire contemporaneamente più processi (linguaggio C).

Inviato: ven 6 apr 2012, 17:22
da 414N
Allora la questione è diversa.
Tu nel tuo primo post hai parlato di avviare "diversi programmi" da un programma iniziale senza che questo stia ad attendere la terminazione di quelli che ha lanciato. Dato che "diversi programmi" è da interpretare come "eseguibili esterni" al tuo programma, ti ho proposto l'accoppiata fork + exec per creare un nuovo processo (fork) e fargli eseguire un programma/eseguibile esterno (exec).
Da quello che dici non mi è chiaro se hanoi.c produce un eseguibile a sé stante (con un suo main) oppure se produce solo codice oggetto che in fase di linking colleghi nel tuo main.c. Nel caso sia un programma eseguibile a sé stante con i suoi parametri da riga di comando, allora l'approccio fork+exec è sensato, altrimenti hai fondamentalmente due strade: creare tanti processi tramite fork() che chiamino la funzione che ti serve con i giusti parametri oppure creare tanti thread (POSIX threads, ovvero pthread) all'interno dello stesso processo che chiamino la funzione.
Il pezzo di codice che hai riportato è sbagliato: dopo la fork, hai due processi che stanno eseguendo lo stesso codice, ovvero il padre ed il figlio. L'unico modo che hai per distinguerli è l'intero ritornato proprio dalla fork:

Codice: Seleziona tutto

pid_t pid = fork();
if (pid == 0) {
	/* codice per il processo figlio, che probabilmente chiamerà hanoi con qualche parametro */
}
if (pid > 0 ) {
	/* codice per il processo padre, che probabilmente continuerà a creare processi fino ad un certo limite. Se sei all'interno di un for, te la cavi con un "continue;" */
}
if (pid == -1 ) {
	/* ERRORE: la fork non è riuscita. Controlla errno per il tipo di errore. */
}
Dovresti comunque valutare se usare processi o thread multipli per eseguire quello che hai in mente. La creazione di un nuovo processo tramite una fork è un'operazione piuttosto costosa (il sistema deve copiare l'immagine del processo in esecuzione nel nuovo processo figlio), mentre la creazione di un thread all'interno di un processo è molto più leggera, anche se bisogna fare molta più attenzione agli accessi in contemporanea a risorse/variabili condivise/globali.
Dato che bollono in pentola diverse conoscenze dei sistemi UNIX-like (processi, thread ed amenità varie ed eventuali), ti consiglio di documentarti bene prima di proseguire per questa strada ;)

Re: Aprire contemporaneamente più processi (linguaggio C).

Inviato: ven 6 apr 2012, 17:29
da NicoMetal
Mi scuso per la poca chiarezza denunciata. Comunque hanoi.c produce oggetto non binario.

Re: Aprire contemporaneamente più processi (linguaggio C).

Inviato: sab 7 apr 2012, 18:41
da 414N
NicoMetal ha scritto:Mi scuso per la poca chiarezza denunciata. Comunque hanoi.c produce oggetto non binario.
Forse intendevi dire "non eseguibile" ;)
È una funzione con qualche parametro oppure è senza parametri?

Re: Aprire contemporaneamente più processi (linguaggio C).

Inviato: sab 7 apr 2012, 19:57
da NicoMetal
414N ha scritto:
NicoMetal ha scritto:Mi scuso per la poca chiarezza denunciata. Comunque hanoi.c produce oggetto non binario.
Forse intendevi dire "non eseguibile" ;)
È una funzione con qualche parametro oppure è senza parametri?
alla fine penso di aver risolto così:

Codice: Seleziona tutto

int main()
 {
        int i;

        for( i =0; i < 10; i++ ){
                pid_t pid =fork();

                if( pid == 0 )
                        hanoimain();
        
                if( pid > 0 )
                        continue;
        }
        return 0;
  }

Re: Aprire contemporaneamente più processi (linguaggio C).

Inviato: sab 7 apr 2012, 20:16
da 414N
Posso sapere lo scopo del programma? È un benchmark per caso?
Da quanto riportato, sembra che il programma non faccia altro che creare 10 sotto-processi che eseguono tutti la medesima cosa...

Re: Aprire contemporaneamente più processi (linguaggio C).

Inviato: sab 7 apr 2012, 20:29
da NicoMetal
414N ha scritto:Posso sapere lo scopo del programma? È un benchmark per caso?
Da quanto riportato, sembra che il programma non faccia altro che creare 10 sotto-processi che eseguono tutti la medesima cosa...
Eheh si più o meno: mi ero fatto come esercizio per impararmi le funzioni ricorsive il gioco della torre d'hanoi. E avevo visto che se gli davo un numero di dischi superiore a 60 mi faceva andare una cpu (ho un quadcore con hypertrading, quindi me ne vede 8 di cpu) a 100. Per curiosità e sfizio volevo vedere se riuscivo a mandarle tutte quante a 100. (ci sono riuscito :) )
ps. IL for però esce dopo 100 iterazioni non dopo dieci. Con dieci il computer ancora va abbastanza tranquillo. Ho riportato 10 solo per rifarmi all'esempio sopra.

Re: Aprire contemporaneamente più processi (linguaggio C).

Inviato: dom 8 apr 2012, 13:51
da NicoMetal
comunque sapresti consigliarmi qualche calcolo da far fare al pc come benchmark al posto della torre d'hanoi, che è poco... valutabile.

Re: Aprire contemporaneamente più processi (linguaggio C).

Inviato: mar 10 apr 2012, 14:45
da 414N
Dipende tutto da cosa vuoi testare mettendo sotto stress la CPU... Intendi testare prestazioni "astratte" della CPU, quali operazioni su interi, float/double, o istruzioni vettoriali oppure prestazioni più "concrete", tipo la velocità di forking, di creazione socket/file ecc.?
Esistono svariati benchmark per testare vari aspetti prestazionali della macchina. Non so se sei mai capitato su Phoronix per leggere alcune notizie/risultati di benchmark, ma sappi che mettono a disposizione anche la suite di tool che usano per eseguire in modo sistematico i loro benchmark e pubblicarne i risultati.

Re: Aprire contemporaneamente più processi (linguaggio C).

Inviato: lun 16 apr 2012, 2:53
da NicoMetal
414N ha scritto:Dipende tutto da cosa vuoi testare mettendo sotto stress la CPU... Intendi testare prestazioni "astratte" della CPU, quali operazioni su interi, float/double, o istruzioni vettoriali oppure prestazioni più "concrete", tipo la velocità di forking, di creazione socket/file ecc.?
Esistono svariati benchmark per testare vari aspetti prestazionali della macchina. Non so se sei mai capitato su Phoronix per leggere alcune notizie/risultati di benchmark, ma sappi che mettono a disposizione anche la suite di tool che usano per eseguire in modo sistematico i loro benchmark e pubblicarne i risultati.
GRazie mille per la dritta!