Tôi đang xem cuốn sách này , Lập trình Linux nâng cao của Mark Mitchell, Jeffrey Oldham và Alex Samuel. Đó là từ năm 2001, vì vậy một chút cũ. Nhưng dù sao tôi cũng thấy nó khá tốt.
Tuy nhiên, tôi đã đến một điểm khi nó khác với những gì Linux của tôi tạo ra trong đầu ra shell. Trên trang 92 (116 trong trình xem), chương 4.5 Thực hiện chủ đề GNU / Linux bắt đầu bằng đoạn có chứa tuyên bố này:
Việc triển khai các luồng POSIX trên GNU / Linux khác với triển khai luồng trên nhiều hệ thống giống UNIX khác theo một cách quan trọng: trên GNU / Linux, các luồng được thực hiện như các quy trình.
Điều này có vẻ như là một điểm quan trọng và sau đó được minh họa bằng mã C. Đầu ra trong cuốn sách là:
main thread pid is 14608
child thread pid is 14610
Và trong Ubuntu 16.04 của tôi, nó là:
main thread pid is 3615
child thread pid is 3615
ps
đầu ra hỗ trợ này.
Tôi đoán một cái gì đó đã thay đổi giữa năm 2001 và bây giờ.
Chương trình con tiếp theo trên trang tiếp theo, Xử lý tín hiệu 4.5.1, được xây dựng dựa trên câu lệnh trước:
Hành vi của sự tương tác giữa các tín hiệu và luồng thay đổi từ một hệ thống giống như UNIX sang hệ thống khác. Trong GNU / Linux, hành vi được quyết định bởi thực tế là các luồng được triển khai như các tiến trình.
Và có vẻ như điều này sẽ còn quan trọng hơn sau này trong cuốn sách. Ai đó có thể giải thích những gì đang xảy ra ở đây?
Tôi đã thấy cái này Có phải các luồng nhân Linux thực sự là các tiến trình kernel? , nhưng nó không giúp được gì nhiều. Tôi bối rối.
Đây là mã 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
trả về cái được gọi là ID nhóm luồng và để có một ID duy nhất cho một quy trình bạn cần sử dụng gettid
. Tuy nhiên, ngoài kernel, hầu hết mọi người và công cụ sẽ gọi một nhóm luồng là một tiến trình và gọi một tiến trình là một luồng, để thống nhất với các hệ thống khác.