เกิดอะไรขึ้นกับกระบวนการ Linux แบบมัลติเธรดหากได้รับสัญญาณ


20

หากกระบวนการ Unix (Posix) ได้รับสัญญาณตัวจัดการสัญญาณจะทำงาน

จะเกิดอะไรขึ้นกับมันในกระบวนการแบบมัลติเธรด? เธรดใดรับสัญญาณ

ในความคิดของฉันสัญญาณ API ควรขยายเพื่อจัดการ (เช่นเธรดของตัวจัดการสัญญาณควรจะสามารถกำหนดได้) แต่การค้นหา infos บนเน็ตฉันพบเปลวไฟนานแค่ปีเดียวในรายชื่อส่งเมลเคอร์เนลของ linux และบน ฟอรั่มที่แตกต่างกัน ตามที่ฉันเข้าใจแล้วแนวคิดของ Linus นั้นแตกต่างจากมาตรฐาน Posix และชั้นแรกที่รองรับเลเยอร์บางส่วนถูกสร้างขึ้น แต่ตอนนี้ Linux ตามรูปแบบ posix

สถานะปัจจุบันคืออะไร


3
ซ้ำของstackoverflow.com/questions/11679568/... "pthreads (7) อธิบายว่าต้อง POSIX.1 หัวข้อทั้งหมดในแอตทริบิวต์หุ้นกระบวนการรวมทั้งการแสดงออกสัญญาณ"
สตีฟ

@ สตีฟขอบคุณ แต่ 1) มันอยู่ในเว็บไซต์ SE อื่น 2) ข้อมูลจำเพาะนี้ไม่ได้ระบุอย่างชัดเจนว่าจะเกิดอะไรขึ้น หมายความว่าอะไรตัวจัดการสัญญาณจะถูกเรียกใช้ในทุกเธรด แต่ดูเหมือนว่าฉันจะเหนือจริงเล็กน้อย 3) คำตอบนั้นไม่ได้ระบุว่ารุ่นของ Linus คืออะไรและทำไมจึงใช้ในปัจจุบัน
peterh - Reinstate Monica

คำตอบ:


9

รายการใน POSIX บน "การสร้างสัญญาณและการจัดส่ง " ใน "เหตุผล: ข้อมูลทั่วไปของอินเทอร์เฟซระบบ" กล่าว

สัญญาณที่สร้างขึ้นสำหรับกระบวนการถูกส่งไปยังเธรดเดียวเท่านั้น ดังนั้นหากมีมากกว่าหนึ่งเธรดที่มีสิทธิ์รับสัญญาณจะต้องเลือกหนึ่งเธรด ทางเลือกของเธรดจะถูกนำไปใช้อย่างเต็มที่จนถึงการใช้งานทั้งคู่เพื่อให้ช่วงกว้างที่สุดเท่าที่เป็นไปได้ของการปรับใช้และให้อิสระในการส่งสัญญาณไปยังเธรด "ที่ง่ายที่สุด" ถ้ามีความแตกต่าง

จากsignal(7)คู่มือบนระบบ Linux:

สัญญาณอาจถูกสร้างขึ้น (และอยู่ระหว่างดำเนินการ) สำหรับกระบวนการโดยรวม (เช่นเมื่อส่งโดยใช้kill(2)) หรือสำหรับเธรดเฉพาะ (เช่นสัญญาณบางอย่างเช่น SIGSEGV และ SIGFPE สร้างขึ้นเนื่องจากการดำเนินการเครื่องเฉพาะ - การเรียนการสอนภาษาเป็นผู้กำกับด้ายเช่นเดียวกับสัญญาณที่กำหนดเป้าหมายที่หัวข้อการใช้งานที่เฉพาะเจาะจงpthread_kill(3)) สัญญาณที่มุ่งเน้นกระบวนการอาจถูกส่งไปยังหนึ่งในเธรดใด ๆ ที่ไม่มีสัญญาณในขณะนี้ หากมีมากกว่าหนึ่งเธรดที่มีสัญญาณถูกปลดบล็อกเคอร์เนลจะเลือกเธรดที่ต้องการส่งสัญญาณ

และในpthreads(7):

เธรดมีการตั้งค่าสแต็คสัญญาณอื่นที่แตกต่างกัน อย่างไรก็ตามการตั้งค่าสัญญาณสแต็กทางเลือกของเธรดใหม่จะถูกคัดลอกจากเธรดที่สร้างขึ้นเพื่อให้เธรดเริ่มต้นใช้ร่วมกันสแต็กสัญญาณทางเลือก (แก้ไขในเคอร์เนล 2.6.16)

จากpthreads(3)คู่มือในระบบ OpenBSD (เป็นตัวอย่างของวิธีการสำรอง):

ตัวจัดการสัญญาณโดยปกติแล้วจะรันบนสแต็กของเธรดที่กำลังเรียกใช้ปัจจุบัน

(ขณะนี้ฉันไม่ทราบว่าจะจัดการสิ่งนี้อย่างไรเมื่อมีหลายเธรดที่ทำงานพร้อมกันบนเครื่องที่ใช้โปรเซสเซอร์หลายตัว)

การนำ Linux เธรดเก่ามาใช้ของเธรด POSIX อนุญาตเฉพาะเธรดเดี่ยวที่แตกต่างกันเท่านั้นที่จะถูกกำหนดเป้าหมายด้วยสัญญาณ จากpthreads(7)บนระบบ Linux:

LinuxThreads ไม่สนับสนุนแนวคิดของสัญญาณที่ควบคุมกระบวนการ: สัญญาณอาจถูกส่งไปยังเธรดเฉพาะเท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.