Estou analisando este livro , Programação Avançada em Linux por Mark Mitchell, Jeffrey Oldham e Alex Samuel. É de 2001, um pouco velho. Mas acho isso muito bom de qualquer maneira.
No entanto, cheguei a um ponto em que ele diverge do que meu Linux produz na saída do shell. Na página 92 (116 no visualizador), o capítulo 4.5 Implementação de Thread GNU / Linux começa com o parágrafo que contém esta declaração:
A implementação de threads POSIX no GNU / Linux difere da implementação de threads em muitos outros sistemas semelhantes ao UNIX de uma maneira importante: no GNU / Linux, os threads são implementados como processos.
Este parece ser um ponto-chave e é posteriormente ilustrado com um código C. A saída do livro é:
main thread pid is 14608
child thread pid is 14610
E no meu Ubuntu 16.04 é:
main thread pid is 3615
child thread pid is 3615
ps
saída suporta isso.
Eu acho que algo deve ter mudado entre 2001 e agora.
O próximo subcapítulo na próxima página, 4.5.1 Manipulação de sinais, se baseia na instrução anterior:
O comportamento da interação entre sinais e threads varia de um sistema semelhante ao UNIX para outro. No GNU / Linux, o comportamento é ditado pelo fato de os threads serem implementados como processos.
E parece que isso será ainda mais importante mais adiante neste livro. Alguém poderia explicar o que está acontecendo aqui?
Eu já vi este. Os threads do kernel do Linux são realmente processos do kernel? , mas isso não ajuda muito. Estou confuso.
Este é o código 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
retorna o que seria chamado de ID do grupo de encadeamentos e para obter um ID exclusivo para um processo que você precisa usar gettid
. No entanto, além do kernel, a maioria das pessoas e ferramentas chama um grupo de encadeamentos de processo e chama um processo de encadeamento, por consistência com outros sistemas.