Aprire contemporaneamente più processi (linguaggio C).

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
NicoMetal
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: dom 2 mag 2010, 18:21
Nome Cognome: Nicola
Slackware: current64
Kernel: 4.3
Desktop: kde5 - FluxBox
Località: Verona

Aprire contemporaneamente più processi (linguaggio C).

Messaggio 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.

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

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

Messaggio 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.

Avatar utente
NicoMetal
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: dom 2 mag 2010, 18:21
Nome Cognome: Nicola
Slackware: current64
Kernel: 4.3
Desktop: kde5 - FluxBox
Località: Verona

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

Messaggio 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.

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

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

Messaggio 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 ;)

Avatar utente
NicoMetal
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: dom 2 mag 2010, 18:21
Nome Cognome: Nicola
Slackware: current64
Kernel: 4.3
Desktop: kde5 - FluxBox
Località: Verona

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

Messaggio da NicoMetal »

Mi scuso per la poca chiarezza denunciata. Comunque hanoi.c produce oggetto non binario.

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

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

Messaggio 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?

Avatar utente
NicoMetal
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: dom 2 mag 2010, 18:21
Nome Cognome: Nicola
Slackware: current64
Kernel: 4.3
Desktop: kde5 - FluxBox
Località: Verona

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

Messaggio 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;
  }

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

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

Messaggio 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...

Avatar utente
NicoMetal
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: dom 2 mag 2010, 18:21
Nome Cognome: Nicola
Slackware: current64
Kernel: 4.3
Desktop: kde5 - FluxBox
Località: Verona

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

Messaggio 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.

Avatar utente
NicoMetal
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: dom 2 mag 2010, 18:21
Nome Cognome: Nicola
Slackware: current64
Kernel: 4.3
Desktop: kde5 - FluxBox
Località: Verona

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

Messaggio da NicoMetal »

comunque sapresti consigliarmi qualche calcolo da far fare al pc come benchmark al posto della torre d'hanoi, che è poco... valutabile.

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

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

Messaggio 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.

Avatar utente
NicoMetal
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: dom 2 mag 2010, 18:21
Nome Cognome: Nicola
Slackware: current64
Kernel: 4.3
Desktop: kde5 - FluxBox
Località: Verona

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

Messaggio 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!

Rispondi