我正在阅读 Mark Mitchell,Jeffrey Oldham和Alex Samuel 所著的 Advanced Linux Programming。是2001年的,所以有点旧了。但是无论如何我都觉得很好。
但是,当它与Linux在shell输出中产生的结果有所不同时,我到了一个地步。在第92页(查看器中为116)上,第4.5章GNU / Linux线程实现始于包含以下语句的段落:
GNU / Linux上的POSIX线程实现与其他许多类UNIX系统上的线程实现有一个重要的区别:在GNU / Linux上,线程被实现为进程。
这似乎是关键点,以后将用C代码进行说明。本书的输出为:
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 Signal Handling建立在上一条语句的基础上:
信号和线程之间的交互行为在一个类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
返回所谓的线程组ID,并为您需要使用的进程获取唯一的ID gettid
。但是,除了内核以外,大多数人和工具都将线程组称为进程,并将进程称为线程,以与其他系统保持一致。