2009-07-02 2 views
9

Su un sistema Linux, il processo figlio visualizza i thread esistenti allo stesso modo del processo padre?e fili esistenti?

int main() { 

    //create thread 1 

    int child_pid = fork(); 

    if (0 == child_pid) 
    { 
     .. 
    } 
    else 
    { 
     .. 
    } 

Poiché l'intero spazio degli indirizzi viene copiato per il processo figlio, cosa succede allo stato dei thread. Cosa succede se il thread 1 nel segmento sopra è in attesa su un segnale condizionale. È nello stato di attesa anche nel processo figlio?

risposta

0

I thread non sono ereditati da un processo figlio su un sistema Linux utilizzando fork(). Una fonte di approfondimento è qui: http://linas.org/linux/threads-faq.html

+2

Queste domande frequenti non sono aggiornate. La più grande differenza visibile all'utente è che LinuxThreads è stato reso obsoleto da NPTL sin dal kernel 2.6 e glibc 2.3, che risolve tutti i problemi in sospeso con un comportamento di threading non POSIX. – ephemient

13

I thread su linux oggigiorno cercano di rimanere complienti. Solo il thread chiamante viene replicata, non altri thread (si noti che per esempio su Solaris si può scegliere ciò che la forcella non a seconda di quale libreria si collega a)

Da http://www.opengroup.org/onlinepubs/000095399/functions/fork.html:

Un processo deve essere creato con un thread singolo. Se un processo multi-thread chiama fork(), il nuovo processo deve contenere una replica del thread di chiamata e il suo intero spazio di indirizzamento, possibilmente compresi gli stati di mutex e altre risorse. Di conseguenza, per evitare errori, la procedura figlio può eseguire solo operazioni con segnale asincrono fino a nel momento in cui viene chiamata una delle funzioni exec . Forcella Gli handler possono essere stabiliti con il numero della funzione pthread_atfork() in in modo da mantenere gli invarianti dell'applicazione attraverso le chiamate a fork().

+1

Grazie. Il collegamento è di grande aiuto. – Mac13