ฉันจะอ่านหนังสือเล่มนี้การเขียนโปรแกรม Linux ขั้นสูงโดย Mark Mitchell, Jeffrey Oldham และ Alex Samuel มันมาจากปี 2001 เก่าไปหน่อย แต่ฉันคิดว่ามันค่อนข้างดี แต่อย่างใด
อย่างไรก็ตามฉันมาถึงจุดที่มันแตกต่างจากสิ่งที่ Linux ของฉันผลิตในการส่งออกเปลือก บนหน้า 92 (116 ในตัวแสดง) บทที่ 4.5 การใช้งานเธรด GNU / Linux เริ่มต้นด้วยย่อหน้าที่มีคำสั่งนี้:
การติดตั้งเธรด POSIX บน GNU / Linux แตกต่างจากการใช้เธรดในระบบที่คล้ายกับ 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 การจัดการสัญญาณสร้างขึ้นบนคำสั่งก่อนหน้า:
พฤติกรรมของการมีปฏิสัมพันธ์ระหว่างสัญญาณและเธรดแตกต่างกันไปจากระบบที่เหมือน 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 ด้ายgettid
และเพื่อให้ได้หมายเลขที่ไม่ซ้ำกันสำหรับกระบวนการที่คุณจำเป็นต้องใช้ อย่างไรก็ตามนอกเหนือจากเคอร์เนลคนและเครื่องมือส่วนใหญ่จะเรียกกระบวนการกลุ่มเธรดและเรียกกระบวนการเธรดสำหรับความสอดคล้องกับระบบอื่น ๆ