สัญญาณ (IPC)

จากวิกิพีเดีย สารานุกรมเสรี
ข้ามไปที่การนำทาง ข้ามไปที่การค้นหา

สัญญาณเป็นข้อความมาตรฐานที่ส่งไปยังโปรแกรมที่ กำลังทำงานอยู่ เพื่อกระตุ้นการทำงานเฉพาะ เช่น การออกจากระบบหรือการจัดการข้อผิดพลาด เป็นรูปแบบจำกัดของการสื่อสารระหว่างกระบวนการ (IPC) ซึ่งมักใช้ในUnix , Unix-likeและระบบปฏิบัติการ อื่นๆ ที่สอดคล้องกับ POSIX

สัญญาณคือการ แจ้งเตือน แบบอะซิงโครนัสที่ส่งไปยังกระบวนการหรือไปยังเธรด เฉพาะ ภายในกระบวนการเดียวกันเพื่อแจ้งเหตุการณ์ การใช้สัญญาณโดยทั่วไปคือการขัดจังหวะ ระงับ ยุติหรือฆ่ากระบวนการ สัญญาณเกิดขึ้นในปี 1970 Bell Labs Unix และระบุในภายหลังในมาตรฐาน POSIX

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

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

สัญญาณคล้ายกับอินเตอร์รัปต์ ความแตกต่างที่อินเตอร์รัปต์ถูกสื่อกลางโดยCPUและจัดการโดยเคอร์เนลในขณะที่สัญญาณถูกไกล่เกลี่ยโดยเคอร์เนล (อาจผ่านการเรียกของระบบ) และจัดการโดยแต่ละกระบวนการ [ ต้องการการอ้างอิง ]เคอร์เนลอาจส่งผ่านอินเตอร์รัปต์เป็นสัญญาณไปยังกระบวนการที่ทำให้เกิดมัน (ตัวอย่างทั่วไปคือSIGSEGV , SIGBUS , SIGILLและSIGFPE )

ประวัติ

เวอร์ชัน 1 Unix มี การเรียกระบบแยกกันเพื่อดักจับการขัดจังหวะ การออกจากระบบ และกับดักของเครื่อง เวอร์ชัน 4รวมกับดักทั้งหมดเข้าเป็นการโทรครั้งเดียวสัญญาณและกับดักที่มีหมายเลขแต่ละรายการได้รับชื่อเชิงสัญลักษณ์ในเวอร์ชัน 7 killปรากฏในเวอร์ชัน 2และในเวอร์ชัน 5สามารถส่งสัญญาณได้ตามอำเภอใจ [1]แผน 9 จาก Bell Labsแทนที่สัญญาณด้วยบันทึกย่อซึ่งอนุญาตให้ส่งสตริงสั้น ๆ โดยพลการ [2]

การส่งสัญญาณ

การ เรียกระบบ kill (2)จะส่งสัญญาณที่ระบุไปยังกระบวนการที่ระบุ หากการอนุญาตอนุญาต ในทำนองเดียวกัน คำสั่ง kill(1)อนุญาตให้ผู้ใช้ส่งสัญญาณไปยังกระบวนการ ฟังก์ชันไลบรารี การยก (3)ส่งสัญญาณที่ระบุไปยังกระบวนการปัจจุบัน

ข้อยกเว้นเช่น การหารด้วยศูนย์การละเมิดการแบ่งส่วน ( SIGSEGV ) และข้อยกเว้นจุดทศนิยม ( SIGFPE ) จะทำให้เกิดการถ่ายโอนข้อมูลหลักและยุติโปรแกรม

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

การพิมพ์คีย์ผสมบางตัวที่เทอร์มินัลควบคุมของกระบวนการที่ทำงานอยู่ทำให้ระบบส่งสัญญาณบางอย่าง: [3]

  • Ctrl-C (ใน Unixes รุ่นเก่า DEL) ส่งสัญญาณ INT ("ขัดจังหวะ", SIGINT ); โดยค่าเริ่มต้น จะทำให้กระบวนการยุติลง
  • Ctrl-Zส่งสัญญาณ TSTP ("เทอร์มินัลหยุด", SIGTSTP ); โดยค่าเริ่มต้น การดำเนินการนี้จะทำให้กระบวนการหยุดการทำงานชั่วคราว [4]
  • Ctrl-\ส่งสัญญาณ QUIT ( SIGQUIT ); โดยค่าเริ่มต้น จะทำให้กระบวนการยุติและถ่ายโอนข้อมูลหลัก
  • Ctrl-T (ไม่รองรับ UNIX ทั้งหมด) ส่งสัญญาณ INFO ( SIGINFO ); โดยค่าเริ่มต้น และหากได้รับการสนับสนุนโดยคำสั่ง จะทำให้ระบบปฏิบัติการแสดงข้อมูลเกี่ยวกับคำสั่งที่ทำงานอยู่ [5]

คีย์ผสมเริ่มต้นเหล่านี้กับระบบปฏิบัติการสมัยใหม่สามารถเปลี่ยนได้ด้วยคำสั่ง stty

การจัดการสัญญาณ

ตัวจัดการสัญญาณสามารถติดตั้งได้ด้วยการเรียกระบบsignal (2)หรือsigaction(2) หากไม่ได้ติดตั้งตัวจัดการสัญญาณสำหรับสัญญาณเฉพาะ ตัวจัดการเริ่มต้นจะถูกใช้ มิฉะนั้น สัญญาณจะถูกสกัดกั้นและตัวจัดการสัญญาณจะถูกเรียกใช้ กระบวนการยังสามารถระบุพฤติกรรมเริ่มต้นสองแบบ โดยไม่ต้องสร้างตัวจัดการ: ละเว้นสัญญาณ (SIG_IGN) และใช้ตัวจัดการสัญญาณเริ่มต้น (SIG_DFL) มีสองสัญญาณที่ไม่สามารถสกัดกั้นและจัดการ: SIGKILLและSIGSTOP

ความเสี่ยง

การจัดการสัญญาณมีความเสี่ยงต่อ สภาพ การแข่งขัน เนื่องจากสัญญาณเป็นแบบอะซิงโครนัส สัญญาณอื่น (แม้จะเป็นประเภทเดียวกัน) ก็สามารถส่งไปยังกระบวนการได้ในระหว่างการดำเนินการตามรูทีนการจัดการสัญญาณ

สามารถใช้ การ เรียก sigprocmask (2)เพื่อบล็อกและปลดบล็อกการส่งสัญญาณ สัญญาณที่ถูกบล็อกจะไม่ถูกส่งไปยังกระบวนการจนกว่าจะยกเลิกการปิดกั้น สัญญาณที่ไม่สามารถเพิกเฉยได้ (SIGKILL และ SIGSTOP) ไม่สามารถปิดกั้นได้

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

ตัวจัดการสัญญาณควรเขียนในลักษณะที่ไม่ส่งผลให้เกิดผลข้างเคียงที่ไม่ต้องการ เช่น การเปลี่ยนแปลง errnoการเปลี่ยนรูปแบบสัญญาณ การเปลี่ยนการจัดการสัญญาณ และการเปลี่ยนแปลงแอตทริบิวต์ของกระบวนการ ทั่วโลกอื่นๆ การใช้ฟังก์ชันที่ไม่ย้อน กลับ เช่นmallocหรือprintfตัวจัดการสัญญาณภายในก็ไม่ปลอดภัยเช่นกัน โดยเฉพาะอย่างยิ่ง ข้อมูลจำเพาะ POSIX และสัญญาณ man page ของ Linux (7)กำหนดให้ระบบทั้งหมดทำงานโดยตรงหรือโดยอ้อมที่เรียกจากฟังก์ชันสัญญาณเป็นasync -signal safe [6] [7]สัญญาณ-ความปลอดภัย(7)man page แสดงรายการของฟังก์ชันระบบความปลอดภัย async-signal (ในทางปฏิบัติการเรียกระบบ ) ไม่เช่นนั้นจะเป็นพฤติกรรม ที่ไม่ได้กำหนด ไว้ [8]ขอแนะนำให้ตั้งค่าvolatile sig_atomic_tตัวแปรบางตัวในตัวจัดการสัญญาณ และทดสอบกับที่อื่น [9]

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

ความสัมพันธ์กับข้อยกเว้นของฮาร์ดแวร์

การ ดำเนินการของ กระบวนการอาจส่งผลให้เกิดการยกเว้น ฮาร์ดแวร์ ตัวอย่างเช่น หากกระบวนการพยายามหารด้วยศูนย์หรือทำให้เกิดข้อบกพร่องของ หน้า

ในระบบปฏิบัติการที่คล้ายกับ Unixเหตุการณ์นี้จะเปลี่ยนบริบทของ ตัวประมวลผลโดยอัตโนมัติ เพื่อเริ่มดำเนินการ ตัวจัดการ ข้อยกเว้นเคอร์เนล ในกรณีที่มีข้อยกเว้นบางประการ เช่นข้อบกพร่องของเพจเคอร์เนลมีข้อมูลเพียงพอที่จะจัดการกับเหตุการณ์เองได้อย่างเต็มที่และดำเนินการตามกระบวนการต่อ

อย่างไรก็ตาม ข้อยกเว้นอื่นๆ เคอร์เนลไม่สามารถประมวลผลอย่างชาญฉลาด และต้องเลื่อนการดำเนินการจัดการข้อยกเว้นไปเป็นกระบวนการที่ผิดพลาดแทน การเลื่อนเวลานี้ทำได้โดยใช้กลไกสัญญาณ ซึ่งเคอร์เนลจะส่งสัญญาณที่สอดคล้องกับข้อยกเว้นปัจจุบันไปยังกระบวนการ ตัวอย่างเช่น หากกระบวนการพยายามหาจำนวนเต็มหารด้วยศูนย์บนx86 CPU จะมีการสร้างข้อยกเว้นข้อผิดพลาด ในการหารและทำให้เคอร์เนลส่ง สัญญาณ SIGFPEไปยังกระบวนการ

ในทำนองเดียวกัน หากกระบวนการพยายามเข้าถึงที่อยู่หน่วยความจำนอกพื้นที่ที่อยู่เสมือนเคอร์เนลจะแจ้งกระบวนการของการละเมิดนี้ผ่านSIGSEGV ( สัญญาณ การละเมิดการแบ่งส่วน ) การแมปที่แน่นอนระหว่างชื่อสัญญาณและข้อยกเว้นนั้นขึ้นอยู่กับ CPU เนื่องจากประเภทข้อยกเว้นแตกต่างกันระหว่างสถาปัตยกรรม

สัญญาณ POSIX

รายการด้านล่างบันทึกสัญญาณที่ระบุในข้อกำหนดSingle Unix สัญญาณทั้งหมดถูกกำหนดเป็นค่าคงที่มาโครใน<signal.h>ไฟล์ส่วนหัว ชื่อของค่าคงที่มาโครประกอบด้วย คำนำหน้า "SIG" ตามด้วยชื่อช่วยในการจำสัญญาณ

SIGABRTและSIGIOT
"ยกเลิกสัญญาณ", "กับดักสัญญาณอินพุต/เอาต์พุต"
สัญญาณ SIGABRT และ SIGIOT จะถูกส่งไปยังกระบวนการเพื่อบอกให้abortกล่าวคือ ยุติ โดยปกติสัญญาณจะเริ่มโดยกระบวนการเองเมื่อเรียกabort()ใช้ฟังก์ชันของC Standard Libraryแต่สามารถส่งไปยังกระบวนการจากภายนอกได้เช่นเดียวกับสัญญาณอื่นๆ
ซิกัล ม์ ,SIGVTALRMและSIGPROF
"สัญญาณเตือนภัย", "สัญญาณเตือน VT สัญญาณ", "สัญญาณเตือนตัวจับเวลาการทำโปรไฟล์สัญญาณ"
สัญญาณ SIGALRM, SIGVTALRM และ SIGPROF จะถูกส่งไปยังกระบวนการเมื่อหมดเวลาที่กำหนดไว้ในการเรียก ฟังก์ชันการตั้งค่าการ เตือน ก่อนหน้า (เช่นsetitimer) SIGALRM ถูกส่งเมื่อเวลาจริงหรือนาฬิกาผ่านไป SIGVTALRM ถูกส่งเมื่อเวลา CPU ที่ใช้โดยกระบวนการผ่านไป SIGPROF ถูกส่งเมื่อเวลา CPU ถูกใช้โดยกระบวนการและโดยระบบในนามของกระบวนการที่ผ่านไป กล่าวคือ เมื่อตัวจับเวลาการทำโปรไฟล์หมดเวลา
ซิกบัส
"ป้ายรถเมล์"
สัญญาณSIGBUSจะถูกส่งไปยังกระบวนการเมื่อทำให้เกิด ข้อผิดพลาด ของบัส เงื่อนไขที่นำไปสู่การส่งสัญญาณ เช่น การจัดตำแหน่งการเข้าถึงหน่วยความจำไม่ถูกต้องหรือที่อยู่ทางกายภาพที่ไม่มีอยู่จริง
SIGCHLD
"เด็กสัญญาณ"
สัญญาณSIGCHLDจะถูกส่งไปยังโปรเซสเมื่อโปรเซสลูก ยุติถูกขัดจังหวะ หรือกลับมาทำงานต่อหลังจากถูกขัดจังหวะ การใช้สัญญาณทั่วไปอย่างหนึ่งคือการสั่งให้ระบบปฏิบัติการล้างข้อมูลทรัพยากรที่ใช้โดยกระบวนการลูกหลังจากการยุติโดยไม่มีการเรียกที่ชัดเจนในการwaitเรียกระบบ
ซิกคอน
“สัญญาณดำเนินต่อไป”
สัญญาณSIGCONTสั่งให้ระบบปฏิบัติการดำเนินการต่อ (เริ่มต้นใหม่) กระบวนการที่หยุดไว้ก่อนหน้านี้โดยสัญญาณ SIGSTOP หรือ SIGTSTP การใช้สัญญาณนี้ที่สำคัญอย่างหนึ่งคือการควบคุมงานในเชลล์Unix
SIGFPE
"สัญญาณผิดพลาดจุดทศนิยม "
สัญญาณ SIGFPE จะถูกส่งไปยังกระบวนการเมื่อมีการตรวจพบเงื่อนไขพิเศษ (แต่ไม่จำเป็นต้องผิดพลาด) ในฮาร์ดแวร์จุดลอยตัวหรือเลขคณิตจำนวนเต็ม ซึ่งอาจรวมถึงการหารด้วยศูนย์ , จุดลอยตัวอันเดอร์โฟลว์หรือโอเวอร์โฟลว์ , โอเวอร์โฟลว์จำนวนเต็ม , การดำเนินการที่ไม่ถูกต้อง หรือการคำนวณที่ไม่แน่นอน ลักษณะการทำงานอาจแตกต่างกันไปขึ้นอยู่กับฮาร์ดแวร์
ซิกอัพ
“สัญญาณหลุด”
สัญญาณSIGHUPจะถูกส่งไปยังกระบวนการเมื่อปิดเทอร์มินัลการควบคุม เดิมได้รับการออกแบบเพื่อแจ้งกระบวนการ วาง สายอนุกรม ( hangup ) ในระบบสมัยใหม่ สัญญาณนี้มักจะหมายความว่าตัวควบคุมหลอกหรือเทอร์มินัลเสมือนถูกปิด [10]ภูตจำนวนมาก(ที่ไม่มีเทอร์มินัลการควบคุม) ตีความการรับสัญญาณนี้เป็นคำขอให้โหลดไฟล์การกำหนดค่าใหม่และล้าง/เปิดล็อกไฟล์อีกครั้งแทนที่จะออก [11] nohupเป็นคำสั่งให้คำสั่งละเว้นสัญญาณ
SIGILL
"สัญญาณผิดกฎหมาย"
สัญญาณ SIGILL จะถูกส่งไปยังกระบวนการเมื่อพยายามดำเนินการคำสั่งที่ผิดกฎหมาย ผิดรูปแบบ ไม่รู้จักหรือมีสิทธิพิเศษ
SIGINT
"สัญญาณรบกวน"
สัญญาณ SIGINT จะถูกส่งไปยังกระบวนการโดยเทอร์มินัลควบคุมเมื่อผู้ใช้ต้องการขัดจังหวะกระบวนการ โดยทั่วไปจะเริ่มโดยการกดCtrl+Cแต่ในบางระบบ สามารถใช้อักขระ " delete " หรือ " break " ได้ (12)
ซิกคิลล์
"สัญญาณฆ่า"
สัญญาณ SIGKILL ถูกส่งไปยังกระบวนการเพื่อทำให้สิ้นสุดทันที ( kill ) ตรงกันข้ามกับ SIGTERM และ SIGINT สัญญาณนี้ไม่สามารถจับหรือละเลยได้ และกระบวนการรับไม่สามารถดำเนินการล้างใดๆ เมื่อรับสัญญาณนี้ มีข้อยกเว้นดังต่อไปนี้:
  • กระบวนการซอมบี้ไม่สามารถฆ่าได้เนื่องจากพวกมันตายไปแล้วและรอให้กระบวนการของผู้ปกครองเก็บเกี่ยว
  • กระบวนการที่อยู่ในสถานะถูกบล็อกจะไม่ตายจนกว่าจะตื่นขึ้นอีกครั้ง
  • กระบวนการเริ่มต้นมีความพิเศษ: ไม่ได้รับสัญญาณว่าไม่ต้องการจัดการ ดังนั้นจึงสามารถเพิกเฉยต่อ SIGKILL ได้ [13]ข้อยกเว้นจากกฎนี้คือในขณะที่ init ถูกptracedบน Linux [14] [15]
  • กระบวนการ สลีป อย่างต่อเนื่องอาจไม่ยุติ (และทำให้ทรัพยากรของกระบวนการนี้ว่าง) แม้ว่าจะส่ง SIGKILL ไปแล้วก็ตาม นี่เป็นหนึ่งในไม่กี่กรณีที่ระบบ UNIX อาจต้องรีบูตเพื่อแก้ปัญหาซอฟต์แวร์ชั่วคราว
SIGKILL ถูกใช้เป็นทางเลือกสุดท้ายเมื่อสิ้นสุดกระบวนการในกระบวนการปิด ระบบส่วนใหญ่ หากไม่ออกจากโดยสมัครใจเพื่อตอบสนองต่อ SIGTERM เพื่อเพิ่มความเร็วให้กับขั้นตอนการปิดเครื่องคอมพิวเตอร์ Mac OS X 10.6 หรือที่รู้จักในชื่อSnow Leopardจะส่ง SIGKILL ไปยังแอปพลิเคชันที่ทำเครื่องหมายว่า "สะอาด" ส่งผลให้เวลาปิดเครื่องเร็วขึ้น และอาจไม่มีผลเสีย [16]คำสั่งkillall -9นี้มีลักษณะคล้ายกัน ในขณะที่มีผลอันตราย เมื่อดำเนินการเช่นในลินุกซ์ ไม่อนุญาตให้โปรแกรมบันทึกข้อมูลที่ไม่ได้บันทึก มีตัวเลือกอื่นๆ และไม่มีเลย ใช้สัญญาณ SIGTERM ที่ปลอดภัยกว่า
SIGPIPE
"ท่อสัญญาณ"
สัญญาณ SIGPIPE จะถูกส่งไปยังกระบวนการเมื่อพยายามเขียนไปยังไพพ์โดยไม่มีกระบวนการเชื่อมต่อกับปลายอีกด้าน
ซิกโพล
“แบบสำรวจสัญญาณ”
สัญญาณ SIGPOLL ถูกส่งเมื่อมีเหตุการณ์เกิดขึ้นกับตัวอธิบายไฟล์ที่เฝ้าดูอย่างชัดเจน [17]การใช้มันอย่างมีประสิทธิภาพนำไปสู่การสร้าง คำขอ I/O แบบอะซิงโครนัสเนื่องจากเคอร์เนลจะสำรวจตัวอธิบายแทนผู้โทร มันให้ทางเลือกแทนการสำรวจ ที่ใช้งาน อยู่
SIGRTMINถึงSIGRTMAX
"สัญญาณเรียลไทม์ขั้นต่ำ", "สัญญาณเรียลไทม์สูงสุด"
สัญญาณ SIGRTMIN ถึง SIGRTMAX มีวัตถุประสงค์เพื่อใช้เพื่อวัตถุประสงค์ที่ผู้ใช้กำหนด เป็นสัญญาณเรียลไทม์
SIGQUIT
“สัญญาณเลิก”
สัญญาณ SIGQUIT ถูกส่งไปยังกระบวนการโดยเทอร์มินัลควบคุมเมื่อผู้ใช้ร้องขอให้ออกจาก กระบวนการ และดำเนินการถ่ายโอนข้อมูลหลัก
SIGSEGV
"การละเมิดการแบ่งส่วนสัญญาณ"
สัญญาณSIGSEGVจะถูกส่งไปยังกระบวนการเมื่อทำให้การอ้างอิงหน่วยความจำเสมือนไม่ถูกต้อง หรือความผิดพลาดในการแบ่งเซ็กเมนต์เช่น เมื่อดำเนินการseg mentation v iolation [18]
SIGSTOP
“สัญญาณหยุด”
สัญญาณSIGSTOPสั่งให้ระบบปฏิบัติการหยุดกระบวนการเพื่อเริ่มต้นใหม่ในภายหลัง
ซิกซิส
"ระบบสัญญาณเรียก"
สัญญาณ SIGSYS จะถูกส่งไปยังกระบวนการเมื่อส่งผ่านอาร์กิวเมนต์ที่ไม่ถูกต้องไปยังการเรียกของระบบ ในทางปฏิบัติ สัญญาณประเภทนี้ไม่ค่อยพบเนื่องจากแอปพลิเคชันอาศัยไลบรารี (เช่นlibc ) เพื่อทำการเรียก สามารถรับ SIGSYS ได้โดยแอปพลิเคชันที่ละเมิดกฎความปลอดภัย Linux Seccompที่กำหนดค่าให้จำกัด SIGSYS ยังสามารถใช้เพื่อจำลองการเรียกระบบจากต่างประเทศ เช่น จำลองการเรียกระบบ Windows บน Linux (19)
SIGTERM
“สัญญาณยุติ”
สัญญาณ SIGTERM ถูกส่งไปยังกระบวนการเพื่อขอยุติ ต่างจากสัญญาณ SIGKILL มันสามารถจับและตีความหรือละเลยโดยกระบวนการ ซึ่งช่วยให้กระบวนการดำเนินการยุติการปล่อยทรัพยากรที่ดีและบันทึกสถานะตามความเหมาะสม SIGINT เกือบจะเหมือนกับ SIGTERM
SIGTSTP
“ขั้วสัญญาณหยุด”
สัญญาณSIGTSTPถูกส่งไปยังกระบวนการโดยเทอร์มินัล ควบคุม เพื่อขอให้หยุด ( tขั้วst o p ) โดยทั่วไปจะเริ่มโดยผู้ ใช้กด+ ต่างจาก SIGSTOP กระบวนการสามารถลงทะเบียนตัวจัดการสัญญาณหรือเพิกเฉยต่อสัญญาณได้CtrlZ
SIGTTINและซิกโตว
สัญญาณSIGTTINและSIGTTOUจะถูกส่งไปยังกระบวนการเมื่อพยายามอ่านหรือเขียนตามลำดับจากtty ขณะอยู่ในพื้นหลัง โดยปกติ สัญญาณเหล่านี้จะได้รับโดยกระบวนการภายใต้การควบคุมงานเท่านั้น daemonsไม่มีเทอร์มินัลควบคุม ดังนั้น ไม่ควรรับสัญญาณเหล่านี้
ซิกแทรป
"กับดักสัญญาณ"
สัญญาณ SIGTRAP จะถูกส่งไปยังกระบวนการเมื่อมีข้อยกเว้น (หรือtrap ) เกิดขึ้น: เงื่อนไขที่โปรแกรมแก้ไขข้อบกพร่องร้องขอให้แจ้ง เช่น เมื่อมีการเรียกใช้ฟังก์ชัน เฉพาะ หรือเมื่อตัวแปร เฉพาะ เปลี่ยนแปลงค่า
SIGURG
“สัญญาณด่วน”
สัญญาณSIGURGจะถูกส่งไปยังกระบวนการเมื่อซ็อกเก็ตมี ข้อมูล เร่งด่วนหรือข้อมูลนอกย่านความถี่ที่สามารถอ่านได้
SIGUSR1และSIGUSR2
"ผู้ใช้สัญญาณ 1", "ผู้ใช้สัญญาณ 2""
สัญญาณ SIGUSR1 และ SIGUSR2 จะถูกส่งไปยังกระบวนการเพื่อระบุ เงื่อนไข ที่ผู้ใช้กำหนด
SIGXCPU
"สัญญาณเกิน CPU"
สัญญาณ SIGXCPU จะถูกส่งไปยังกระบวนการเมื่อใช้CPU จนหมด ในระยะเวลาที่เกินค่าที่กำหนดโดยผู้ใช้ที่กำหนดไว้ล่วงหน้า [20]การมาถึงของสัญญาณ SIGXCPU ช่วยให้กระบวนการรับมีโอกาสบันทึกผลลัพธ์ขั้นกลางอย่างรวดเร็วและออกจากระบบอย่างสง่างาม ก่อนที่ระบบปฏิบัติการจะยุติการทำงานโดยใช้สัญญาณ SIGKILL
SIGXFSZ
"สัญญาณขนาดไฟล์เกิน"
สัญญาณ SIGXFSZ จะถูกส่งไปยังกระบวนการเมื่อขยายไฟล์ที่เกินขนาดสูงสุดที่อนุญาต
ซิกวินช์
“สัญญาณหน้าต่างเปลี่ยน”
สัญญาณ SIGWINCH จะถูกส่งไปยังกระบวนการเมื่อเทอร์มินัลควบคุมเปลี่ยนขนาด ( win dow ch ange) (21)

การกระทำเริ่มต้น

กระบวนการสามารถกำหนดวิธีจัดการกับสัญญาณ POSIX ที่เข้ามา หากกระบวนการไม่ได้กำหนดลักษณะการทำงานสำหรับสัญญาณ แสดงว่าตัวจัดการเริ่มต้นสำหรับสัญญาณนั้นจะถูกใช้ ตารางด้านล่างแสดงรายการการดำเนินการเริ่มต้นบางอย่างสำหรับระบบ UNIX ที่เข้า กัน ได้กับ POSIX เช่นFreeBSD , OpenBSDและLinux

สัญญาณ
เบอร์พกพา
การกระทำเริ่มต้น คำอธิบาย
SIGABRT 6 ยุติ (การถ่ายโอนข้อมูลหลัก) กระบวนการยกเลิกสัญญาณ
SIGALRM 14 ยุติ นาฬิกาปลุก
ซิกบัส ไม่มี ยุติ (การถ่ายโอนข้อมูลหลัก) เข้าถึงส่วนที่ไม่ได้กำหนดของวัตถุหน่วยความจำ
SIGCHLD ไม่มี ไม่สนใจ กระบวนการลูกสิ้นสุด หยุด หรือดำเนินต่อไป
ซิกคอน ไม่มี ดำเนินการต่อ ดำเนินการต่อไปถ้าหยุด
SIGFPE 8 ยุติ (การถ่ายโอนข้อมูลหลัก) การคำนวณทางคณิตศาสตร์ผิดพลาด
ซิกอัพ 1 ยุติ วางสาย
SIGILL 4 ยุติ (การถ่ายโอนข้อมูลหลัก) คำสั่งที่ผิดกฎหมาย
SIGINT 2 ยุติ สัญญาณขัดจังหวะเทอร์มินัล
ซิกคิลล์ 9 ยุติ ฆ่า (ไม่สามารถจับหรือเพิกเฉยได้)
SIGPIPE 13 ยุติ เขียนบนท่อไม่มีคนอ่าน
ซิกโพล ไม่มี ยุติ เหตุการณ์ที่สำรวจได้
SIGPROF ไม่มี ยุติ ตัวจับเวลาการทำโปรไฟล์หมดอายุ
SIGQUIT 3 ยุติ (การถ่ายโอนข้อมูลหลัก) เทอร์มินัลออกจากสัญญาณ
SIGSEGV 11 ยุติ (การถ่ายโอนข้อมูลหลัก) การอ้างอิงหน่วยความจำไม่ถูกต้อง
SIGSTOP ไม่มี หยุด หยุดดำเนินการ (ไม่สามารถจับหรือละเลยได้)
ซิกซิส ไม่มี ยุติ (การถ่ายโอนข้อมูลหลัก) ระบบโทรไม่ดี
SIGTERM 15 ยุติ สัญญาณสิ้นสุด
ซิกแทรป 5 ยุติ (การถ่ายโอนข้อมูลหลัก) กับดักร่องรอย/เบรกพอยต์
SIGTSTP ไม่มี หยุด เทอร์มินัลหยุดสัญญาณ
SIGTTIN ไม่มี หยุด กระบวนการเบื้องหลังพยายามอ่าน
ซิกโตว ไม่มี หยุด กระบวนการเบื้องหลังพยายามเขียน
SIGUSR1 ไม่มี ยุติ สัญญาณที่ผู้ใช้กำหนด 1
SIGUSR2 ไม่มี ยุติ ผู้ใช้กำหนดสัญญาณ2
SIGURG ไม่มี ไม่สนใจ มีข้อมูลนอกแถบความถี่ที่ซ็อกเก็ต
SIGVTALRM ไม่มี ยุติ ตัวจับเวลาเสมือนหมดอายุ
SIGXCPU ไม่มี ยุติ (การถ่ายโอนข้อมูลหลัก) เกินขีดจำกัดเวลาของ CPU
SIGXFSZ ไม่มี ยุติ (การถ่ายโอนข้อมูลหลัก) เกินขีดจำกัดขนาดไฟล์
ซิกวินช์ ไม่มี ไม่สนใจ เปลี่ยนขนาดหน้าต่างเทอร์มินัล
หมายเลขพกพา:
สำหรับสัญญาณส่วนใหญ่ หมายเลขสัญญาณที่สอดคล้องกันคือการกำหนดการใช้งาน คอลัมน์นี้แสดงรายการตัวเลขที่ระบุในมาตรฐาน POSIX [22]
การดำเนินการอธิบาย:
ยุติ  – การสิ้นสุดกระบวนการอย่างผิดปกติ กระบวนการนี้สิ้นสุดลงด้วยผลที่ตามมาทั้งหมดของ _exit() ยกเว้นว่าสถานะที่ทำให้รอได้ () และ waitpid() บ่งชี้ว่ามีการยกเลิกอย่างผิดปกติโดยสัญญาณที่ระบุ
ยุติ (การถ่ายโอนข้อมูลหลัก)  – การสิ้นสุดกระบวนการอย่างผิดปกติ นอกจากนี้ การดำเนินการยกเลิกที่ผิดปกติที่กำหนดโดยการใช้งาน เช่น การสร้างไฟล์หลัก อาจเกิดขึ้น
ละเว้น  - ละเว้นสัญญาณ
หยุด  – หยุด (หรือระงับ) กระบวนการ
ดำเนินการ ต่อ  – ดำเนินการต่อหากหยุดทำงาน มิฉะนั้นให้เพิกเฉยต่อสัญญาณ

สัญญาณเบ็ดเตล็ด

สัญญาณต่อไปนี้ไม่ได้ระบุไว้ในข้อมูลจำเพาะPOSIX อย่างไรก็ตามบางครั้งใช้กับระบบต่างๆ

SIGEMT
สัญญาณ SIGEMT จะถูกส่งไปยังกระบวนการเมื่อมีการจำลองกับ ดัก
ซิกอินโฟ
สัญญาณ SIGINFO จะถูกส่งไปยังกระบวนการเมื่อได้รับคำขอ สถานะ ( info ) จากเทอร์มินัลการควบคุม
SIGPWR
สัญญาณ SIGPWR จะถูกส่งไปยังกระบวนการเมื่อระบบประสบปัญหาไฟฟ้าขัดข้อง
SIGLOST
สัญญาณ SIGLOST จะถูกส่งไปยังกระบวนการเมื่อล็อกไฟล์สูญหาย
SIGSTKFLT
สัญญาณ SIGSTKFLT ถูกส่งไปยังกระบวนการเมื่อตัวประมวลผลร่วมประสบปัญหาst ac k f au lt (เช่น popping เมื่อสแต็กว่างเปล่าหรือพุชเมื่อเต็ม) [23]ถูกกำหนดโดย แต่ไม่ได้ใช้งานบน Linux โดยที่ ข้อผิดพลาดของสแต็กตัวประมวลผลร่วม x87 จะสร้าง SIGFPEแทน [24]
SIGUNUSED
สัญญาณ SIGUNUSED จะถูกส่งไปยังกระบวนการเมื่อมีการเรียกระบบด้วยหมายเลขการเรียกระบบ ที่ ไม่ได้ใช้ มีความหมายเหมือนกันกับ SIGSYS ในสถาปัตยกรรมส่วนใหญ่ [23]
SIGCLD
สัญญาณ SIGCLD มีความหมายเหมือนกันกับ SIGCHLD [23]

ดูเพิ่มเติม

อ้างอิง

  1. แมคอิลรอย, แมรี่แลนด์ (1987). ผู้อ่าน Research Unix: คำอธิบายประกอบที่ตัดตอนมาจากคู่มือโปรแกรมเมอร์, 1971–1986 (PDF) (รายงานทางเทคนิค) ซีเอสทีอาร์ เบลล์แล็บ 139.
  2. กายาร์ดี, ปิเอโตร. "การเขียนโปรแกรม C ในแผน 9 จาก Bell Labs" . doc.cat-v.org _ สืบค้นเมื่อ22 มกราคม 2022 .
  3. ^ "สัญญาณบอกเลิกสัญญา" . ห้องสมุด GNU C )
  4. ^ "สัญญาณควบคุมงาน" . ห้องสมุด GNU C
  5. ^ "สัญญาณเบ็ดเตล็ด" . ห้องสมุด GNU C
  6. ^ "The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition: System Interfaces Chapter 2" . ผับ . opengroup.org สืบค้นเมื่อ20 ธันวาคม 2020 .
  7. ^ "signal(7) - หน้าคู่มือ Linux " man7.org _ สืบค้นเมื่อ20 ธันวาคม 2020 .
  8. ^ "signal-safety(7) - หน้าคู่มือ Linux " man7.org _ สืบค้นเมื่อ20 ธันวาคม 2020 .
  9. ^ "The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition: <signal.h> " ผับ . opengroup.org สืบค้นเมื่อ20 ธันวาคม 2020 .
  10. ไมเคิล เคอร์ริสค์ (25 กรกฎาคม 2552). "สัญญาณ(7)" . คู่มือโปรแกรมเมอร์ Linux (เวอร์ชัน 3.22 ) คลังเก็บเคอร์เนลลินุกซ์ สืบค้นเมื่อ23 กันยายน 2552 .
  11. ^ "perlipc(1)" . คู่มืออ้างอิงโปรแกรมเมอร์ Perl เวอร์ชัน 5.18 perldoc.perl.org - เอกสารอย่างเป็นทางการสำหรับภาษา การเขียนโปรแกรม Perl สืบค้นเมื่อ21 กันยายน 2556 .
  12. ^ "การจัดการ SIGINT และ SIGQUIT อย่างเหมาะสม " สืบค้นเมื่อ6 ตุลาคม 2555 .
  13. ^ https://manpages.ubuntu.com/manpages/zesty/man2/kill.2.htmlส่วนหมายเหตุ
  14. ^ "กระบวนการเริ่มต้น SIGKILL (PID 1) " กองล้น
  15. ^ "รูท kill init โปรเซสได้ไหม" . การแลกเปลี่ยน Unix & Linux Stack
  16. ^ "Mac Dev Center: มีอะไรใหม่ใน Mac OS X: Mac OS X v10.6 " 28 สิงหาคม 2552 . สืบค้นเมื่อ18 พฤศจิกายน 2560 .
  17. ^ "ioctl - ควบคุมอุปกรณ์ STREAM " ข้อกำหนด การเรียกระบบPOSIX กลุ่มเปิด. สืบค้นเมื่อ19 มิถุนายน 2558 .
  18. ^ "อะไรคือ "การละเมิดการแบ่งส่วน"? . support.microfocus.com . สืบค้นเมื่อ22 พฤศจิกายน 2018 .
  19. ^ "Syscall User Dispatch – เอกสารคู่มือ Linux Kernel " เคอร์เนล. org สืบค้นเมื่อ11 กุมภาพันธ์ 2021 .
  20. ^ "getrlimit, setrlimit - ควบคุมการใช้ทรัพยากรสูงสุด " ข้อกำหนด การเรียกระบบPOSIX กลุ่มเปิด. สืบค้นเมื่อ10 กันยายน 2552 .
  21. เคลาเซกเกอร์, โรเบิร์ต (19 มิถุนายน 2017). "0001151: แนะนำสัญญาณใหม่ SIGWINCH และฟังก์ชั่น tcsetsize(), tcgetsize() เพื่อรับ/ตั้งค่าขนาดหน้าต่างเทอร์มินัล " เครื่องมือติดตามข้อบกพร่อง ของAustin Group ออสตินกรุ๊ป สืบค้นเมื่อ12 ตุลาคม 2560 . ยอมรับตามที่ทำเครื่องหมายไว้
  22. ^ "IEEE Std 1003.1-2017 - ฆ่า" . IEEE, กลุ่มเปิด. ความสอดคล้องระหว่างค่าจำนวนเต็มและค่าsig ที่ ใช้จะแสดงในรายการต่อไปนี้ ผลของการระบุsignal_number ใด ๆ นอกเหนือจากที่ระบุไว้ด้านล่างนั้นไม่ได้กำหนดไว้
  23. ^ a b c "signal(7) — Linux manual pages" . manpages.courier-mta.org . สืบค้นเมื่อ22 พฤศจิกายน 2018 .
  24. ^ "Linux 3.0 x86_64: SIGSTKFLT จะเพิ่มเมื่อใด" . กองล้น

ลิงค์ภายนอก