Sto sfogliando questo libro , Advanced Linux Programming di Mark Mitchell, Jeffrey Oldham e Alex Samuel. È del 2001, quindi un po 'vecchio. Ma lo trovo abbastanza buono comunque.
Tuttavia, sono arrivato al punto in cui si differenzia da ciò che il mio Linux produce nell'output della shell. A pagina 92 (116 nel visualizzatore), il capitolo 4.5 L'implementazione del thread GNU / Linux inizia con il paragrafo che contiene questa affermazione:
L'implementazione dei thread POSIX su GNU / Linux differisce dall'implementazione dei thread su molti altri sistemi simili a UNIX in un modo importante: su GNU / Linux, i thread sono implementati come processi.
Questo sembra un punto chiave e in seguito viene illustrato con un codice C. L'output nel libro è:
main thread pid is 14608
child thread pid is 14610
E nel mio Ubuntu 16.04 è:
main thread pid is 3615
child thread pid is 3615
ps
l'output supporta questo.
Immagino che qualcosa sia cambiato tra il 2001 e ora.
Il prossimo sottocapitolo nella pagina successiva, 4.5.1 Gestione dei segnali, si basa sull'affermazione precedente:
Il comportamento dell'interazione tra segnali e thread varia da un sistema simile a UNIX a un altro. In GNU / Linux, il comportamento è dettato dal fatto che i thread sono implementati come processi.
E sembra che questo sarà ancora più importante più avanti nel libro. Qualcuno potrebbe spiegare cosa sta succedendo qui?
Ho visto questo I thread del kernel Linux sono davvero processi del kernel? , ma non aiuta molto. Non ho capito bene.
Questo è il codice C:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void* thread_function (void* arg)
{
fprintf (stderr, "child thread pid is %d\n", (int) getpid ());
/* Spin forever. */
while (1);
return NULL;
}
int main ()
{
pthread_t thread;
fprintf (stderr, "main thread pid is %d\n", (int) getpid ());
pthread_create (&thread, NULL, &thread_function, NULL);
/* Spin forever. */
while (1);
return 0;
}
getpid
restituisce quello che sarebbe chiamato un ID gruppo di thread e per ottenere un ID univoco per un processo che è necessario utilizzare gettid
. Tuttavia, oltre al kernel, la maggior parte delle persone e degli strumenti chiamerà un gruppo di thread un processo e chiamerà un processo un thread, per coerenza con altri sistemi.