2012-03-20 17 views
5

Ho una certa esperienza nell'utilizzo di thread e processi in Windows.Discussioni/Confronto dei processi su Linux/Windows

Qualcuno può spiegare, esiste una mappatura dei thread e dei processi in Windows allo stesso in Linux?

Ciò significa, Thread in Windows == Thread in Linux? -> Ha senso? Processo in Windows == Processo in Linus? -> Ha senso?

Se lo stesso, ho chiamate CreateThread() e CreateProcess() in windows, quali sono le chiamate equivalenti in linux?

Ho letto alcuni post in SO ma la maggior parte di essi non ha chiarito i miei dubbi. Ho pensato di iniziare un nuovo post.

Sarebbe bello se ottengo qualche spiegazione con alcuni semplici esempi (programmazione in C).

+2

Cerca il ['pthread_create'] (http://linux.die.net/man/3/pthread_create) e [' fork'] (http://linux.die.net/man/2/fork) chiama in Linux. –

+1

E non aspettatevi un'equivalenza tra le chiamate di sistema Linux e Windows. Concetti e terminologia sono leggermente diversi. –

+0

Beh, rigorosamente, Linux non ha thread, conosce solo processi e, più recentemente, processi che condividono uno spazio indirizzo e/o descrittori di file. Inoltre non crea mai nuovi processi, ne crea solo copie. Pertanto, anche se risultati finali simili o identici possono essere raggiunti, non esiste una corrispondenza 1: 1 reale su come funziona la roba. – Damon

risposta

6

Bene, ci sono chiamate equivalenti per il tuo scopo in Linux, ma funzionano un po 'diversamente, almeno per il meccanismo di processo.

  1. Per le discussioni, è possibile utilizzare pthread_create. Funziona in modo molto simile a CreateThread, tranne alcuni parametri sono diversi. Dovrebbe essere molto facile da usare. Ecco un buon tutorial: https://computing.llnl.gov/tutorials/pthreads/

  2. L'emulazione di CreateProcess per avviare un processo esterno non è così semplice. Avrai bisogno della famosa combo fork/exec. Innanzitutto, è necessario chiamare fork all'interno del processo principale per generare un processo figlio. Questo bambino viene creato duplicando il processo iniziale. È quindi possibile controllare il flusso controllando il valore restituito da fork:

int rv = fork(); 
// new process was spawned here. The following code is executed 
// by both processes. 
if(rv == 0) 
{ 
    // we are in the child process 
} 
else 
{ 
    // we are in the parent 
} 

Fondamentalmente rv sarà 0 per il bambino e il pid del figlio per il genitore. Spero di non averti perso finora. :)

Passando, avrete bisogno di una chiamata a uno dei exec famiglia di funzioni di avviare un processo esterno:

int rv = fork(); 
// new process was spawned here. The following code is executed 
// by both processes. 
if(rv == 0) 
{ 
    execl("/bin/ls", "ls", NULL); // start the ls process 
} 
else 
{ 
    // we are in the parent 
} 

Nell'esempio di cui sopra, sto iniziando la /bin/ls esterna processo, che stampa il contenuto della cartella corrente.

Ecco un semplice esempio completo: http://flinflon.brandonu.ca/dueck/2001/62306/Processes/Unix%20Examples.htm

Ora si potrebbe chiedere perché è necessario chiamare fork in primo luogo e perché execl non è sufficiente. Questo perché dopo che il programma invocato da execl termina, anche il processo corrente viene terminato e non si desidera che ciò accada nel processo principale.

+0

Grazie .... Bella risposta. –

+0

: Non è possibile avviare il nuovo processo non appena si restituisce il fork(). Voglio dire che non è necessario eseguire la riga successiva dopo fork(), se è possibile passare l'eseguibile a spawn come parte della fork, sarebbe logico proprio come createProcess in windows? –

+0

@ Renjith G: non ho paura. 'fork' non prende alcun parametro. L'unico scopo è duplicare il processo corrente in uno nuovo. 'fork/exec' è il modo standard di linux per avviare un processo esterno. – Tudor

Problemi correlati