Я просматриваю эту книгу « Расширенное программирование для 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
. Однако, кроме ядра, большинство людей и инструментов будут вызывать поток, группирующий процесс, и вызывать процесс потоком для согласованности с другими системами.