2012-11-19 13 views
14

Voglio creare copie di un processo utilizzando fork() in C. Non riesco a capire come passare argomenti alle copie del mio processo. Ad esempio, voglio passare un intero alle copie del processo.Come passare argomenti ai processi creati da fork()

O io che cosa fare, se ho un ciclo in cui io chiamo fork() e voglio passare un valore unico ai processi (ad esempio 0 ... N)

for (int i = 0; i < 4; ++i) { 
    fork(); 
    // pass a unique value to new processes. 
} 
+2

'fork' crea una copia di un processo in corso, non * avvia * un processo. – Beta

+0

Leggi http://advancedlinuxprogramming.com/ –

risposta

15

La parte bella di fork() è che ogni processo si spawn automaticamente ottiene una copia di tutto ciò che il genitore ha, quindi, ad esempio, diciamo che vogliamo passare un int myvar a ciascuno dei due processi figli ma voglio a ciascuno di avere un valore diverso dal processo padre:

int main() 
{ 
    int myvar = 0; 
    if(fork()) 
     myvar = 1; 
    else if(fork()) 
     myvar = 2; 
    else 
     myvar = 3; 

    printf("I'm %d: myvar is %d\n", getpid(), myvar); 
    return 0; 
} 

Così facendo questo permette ogni processo per avere una "copia" di myvar con il proprio valore.

I'm 8517: myvar is 1 
I'm 8518: myvar is 2 
I'm 8521: myvar is 3 

Se non è stato modificato il valore, ogni processo di fork dovrebbe avere lo stesso valore.

+0

grazie mike. hai colpito l'unghia sulla testa –

1

Vedere le exec() family di funzioni.

EDIT: Se stai cercando di inizializzare le copie dello stesso programma come il processo di base, basta continuare a utilizzare le variabili come suggerito da duskwuff.

1

È possibile utilizzare clone() (che è effettivamente utilizzato da fork() stesso). Permette di passare un arg alla funzione di inserimento.

http://linux.die.net/man/2/clone

+3

No, per favore non farlo. 'clone' è un syscall complesso, specifico per Linux, che richiede un'ottima conoscenza di Linux, ed è per lo più riservato ai pochi guru * che implementano * le librerie di thread (à la pthread). Vedi anche la pagina man 'futex (7)'. –

+0

@BasileStarynkevitch: esattamente. Usa il clone solo se stai facendo un vero e proprio hacking di basso livello - l'unico punto di clonazione è quello di permetterti di fare alcune cose nello userspace che prima potevano accadere solo nello spazio del kernel, come l'implementazione dei thread. Non è un uso generale syscall. – Linuxios

7

variabili locali e globali sono intrinsecamente preservato dopo un fork(), quindi non c'è bisogno di "passare gli argomenti". Se stai chiamando una funzione nel processo biforcuta, si può fare qualcosa di simile:

pid_t pid = fork(); 
if (pid == 0) { 
    funcToCallInChild(argument); 
    exit(0); 
} 
6

sono in ritardo di rispondere, ma ecco come lo faccio:

const char *progname = "./yourProgName"; 
const char *argument1 = "arg1"; 
const char *argument2 = "arg2"; 

if (fork() == 0) 
{ 
    // We are the child process, so replace the process with a new executable. 
    execl(progname, progname, argument1, argument2, (char *)NULL); 
} 
// The parent process continues from here. 

In primo luogo, si fork() il processo per creare un nuovo processo. Ha ancora lo stesso spazio di memoria di quello vecchio. fork() restituisce per entrambi i processi padre e figlio. Se fork() restituisce zero, tu sei il processo figlio. Il processo figlio utilizza quindi execl() per sostituire la memoria del processo con uno da un nuovo file.

noti che progname è dato due volte per execl(). Il primo è ciò che execl() in realtà cercherà di eseguire, il secondo è argv [0]. È necessario fornire entrambi o il conteggio degli argomenti sarà disattivato di uno. Il nomeprogame deve contenere tutte le informazioni sul percorso richieste per trovare l'immagine eseguibile desiderata.

io do due argomenti in questo esempio, ma si può passare come molti come si desidera. deve essere terminato con NULL, e penso che devi lanciarlo come (char *) come mostro.

Questo approccio si dà un processo completamente indipendente, con argomenti e un pid unico. Può continuare a funzionare molto tempo dopo la fine del processo genitore, o può terminare prima del genitore.

Problemi correlati