Я переглядаю цю книгу , розширене програмування Linux Марка Мітчелла, Джефрі Олдхема та Алекса Самюеля. Це з 2001 року, так трохи старий. Але я вважаю це досить непоганим.
Однак я дійшов до моменту, коли він розходиться з тим, що виробляє мій Linux у виході оболонки. На сторінці 92 (116 у переглядачі) розділ 4.5 Реалізація потоку GNU / Linux починається з абзацу, що містить це твердження:
Реалізація потоків POSIX у GNU / Linux важливим чином відрізняється від реалізації потоків у багатьох інших системах, схожих на UNIX: у GNU / Linux потоки реалізуються як процеси.
Це здається ключовим моментом і пізніше ілюструється кодом С. Вихід у книзі:
main thread pid is 14608
child thread pid is 14610
А в моєму Ubuntu 16.04 це:
main thread pid is 3615
child thread pid is 3615
ps
вихід підтримує це.
Я здогадуюсь щось змінилося між 2001 і зараз.
Наступна підрозділ на наступній сторінці, 4.5.1 Обробка сигналів, ґрунтується на попередньому операторі:
Поведінка взаємодії між сигналами та потоками змінюється від однієї UNIX-подібної системи до іншої. У GNU / Linux поведінка продиктована тим, що потоки реалізуються як процеси.
І, схоже, це стане ще важливішим згодом у книзі. Може хтось пояснить, що тут відбувається?
Я бачив це. Чи справді нитки ядра Linux є процесами ядра? , але це не дуже допомагає. Я збентежений.
Це код 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
повертає те, що називалося б ідентифікатором групи потоків, і отримує унікальний ідентифікатор для процесу, який потрібно використовувати gettid
. Однак, крім ядра, більшість людей та інструментів називатимуть групу потоків процесом і називають процес потоком для узгодженості з іншими системами.