Je suis en train de parcourir ce livre , Advanced Linux Programming de Mark Mitchell, Jeffrey Oldham et Alex Samuel. C'est à partir de 2001, donc un peu vieux. Mais je trouve ça assez bon quand même.
Cependant, je suis arrivé à un point où il s'écarte de ce que mon Linux produit dans la sortie du shell. Sur la page 92 (116 dans le visualiseur), le chapitre 4.5 Implémentation du thread GNU / Linux commence par le paragraphe contenant cette instruction:
L'implémentation de threads POSIX sur GNU / Linux diffère de l'implémentation de thread sur de nombreux autres systèmes de type UNIX de manière importante: sous GNU / Linux, les threads sont implémentés en tant que processus.
Cela semble être un point clé et est illustré plus tard avec un code C. La sortie dans le livre est:
main thread pid is 14608
child thread pid is 14610
Et dans mon Ubuntu 16.04 c'est:
main thread pid is 3615
child thread pid is 3615
ps
la sortie supporte cela.
Je suppose que quelque chose a dû changer entre 2001 et maintenant.
Le sous-chapitre suivant à la page suivante, 4.5.1 Traitement du signal, reprend la déclaration précédente:
Le comportement de l'interaction entre les signaux et les unités d'exécution varie d'un système de type UNIX à un autre. Sous GNU / Linux, le comportement est dicté par le fait que les threads sont implémentés en tant que processus.
Et il semble que cela sera encore plus important plus tard dans le livre. Quelqu'un pourrait-il expliquer ce qui se passe ici?
J'ai déjà vu celui-ci. Les threads du noyau Linux sont-ils vraiment des processus du noyau? , mais ça n’aide pas beaucoup. Je suis confus.
C'est le code 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
renvoie à présent ce qui serait appelé un identifiant de groupe de threads et obtient un identifiant unique pour un processus que vous devez utiliser gettid
. Cependant, mis à part le noyau, la plupart des utilisateurs et des outils appellent un processus un groupe de threads, et appellent un processus un thread, par souci de cohérence avec les autres systèmes.