สัญญาณ (ไอพีซี)

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

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

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

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

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

ประวัติศาสตร์

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

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

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

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

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

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

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

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

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

ความเสี่ยง

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

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

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

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

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

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

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

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

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

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

สัญญาณ POSIX

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

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

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

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

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

ซิเจมท์
สัญญาณ SIGEMT จะถูกส่งไปยังกระบวนการเมื่อ มี การดักจับจำลอง เกิดขึ้น
ซิกอินโฟ
สัญญาณ SIGINFO จะถูกส่งไปยังกระบวนการเมื่อได้รับคำขอสถานะ ( ข้อมูล ) จากสถานีควบคุม
SIGPWR
สัญญาณ SIGPWR จะถูกส่งไปยังกระบวนการเมื่อระบบประสบปัญหาไฟฟ้าขัดข้อง
ซิกลอส
สัญญาณ SIGLOST จะถูกส่งไปยังกระบวนการเมื่อการล็อคไฟล์สูญหาย
SIGSTKFLT
สัญญาณ SIGSTKFLT ถูกส่งไปยังกระบวนการเมื่อตัวประมวลผลร่วมประสบกับปัญหาst ac k f au lt (เช่น การแตกเมื่อสแต็กว่างหรือพุชเมื่อเต็ม) [23]มันถูกกำหนดโดย แต่ไม่ได้ใช้บน Linux โดยที่ ข้อผิดพลาดสแต็กตัวประมวลผลร่วม x87จะสร้าง SIGFPE แทน[24]
ลงนามแล้ว
สัญญาณ 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 มกราคม 2565 .
  3. ^ "สัญญาณการยุติ" ไลบรารี GNU C )
  4. ^ "สัญญาณควบคุมงาน". ไลบรารี GNU C
  5. ^ "สัญญาณเบ็ดเตล็ด". ไลบรารี GNU C
  6. "ข้อกำหนดเฉพาะของ Open Group Base ฉบับที่ 6, IEEE Std 1003.1, 2004 Edition: อินเทอร์เฟซระบบบทที่ 2" pubs.opengroup.org ​สืบค้นเมื่อ 20 ธันวาคม 2020 .
  7. ^ "signal(7) - หน้าคู่มือ Linux" man7.org . สืบค้นเมื่อ 20 ธันวาคม 2020 .
  8. ^ "ความปลอดภัยของสัญญาณ (7) - หน้าคู่มือ Linux" man7.org . สืบค้นเมื่อ 20 ธันวาคม 2020 .
  9. "ข้อกำหนดเฉพาะของ Open Group Base ฉบับที่ 6, IEEE Std 1003.1, 2004 Edition: <signal.h>" pubs.opengroup.org ​สืบค้นเมื่อ 20 ธันวาคม 2020 .
  10. ไมเคิล เคอร์ริสก์ (25 กรกฎาคม พ.ศ. 2552) "สัญญาณ (7)" คู่มือโปรแกรมเมอร์ Linux (เวอร์ชัน 3.22 ) คลังเก็บเคอร์เนลLinux สืบค้นเมื่อ 23 กันยายน 2552 .
  11. "เพอร์ลิปซี(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 เก็บถาวรเมื่อ 28 มกราคม 2018 ที่ส่วนWayback Machine
  14. "กระบวนการเริ่มต้น SIGKILL (PID 1)" สแต็คโอเวอร์โฟลว์
  15. ^ "สามารถรูทฆ่ากระบวนการเริ่มต้นได้หรือไม่" การแลกเปลี่ยน 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 พฤศจิกายน 2561 .
  19. "การจัดส่งผู้ใช้ Syscall – เอกสารเคอร์เนล Linux" เคอร์เนล. org สืบค้นเมื่อ 11 กุมภาพันธ์ 2564 .
  20. ^ "getrlimit, setrlimit - ควบคุมการใช้ทรัพยากรสูงสุด" ข้อกำหนดการเรียกระบบPOSIXกลุ่มเปิด. สืบค้นเมื่อ 10 กันยายน 2552 .
  21. เคลาเซกเกอร์, โรเบิร์ต (19 มิถุนายน พ.ศ. 2560) "0001151: แนะนำสัญญาณใหม่ SIGWINCH และฟังก์ชัน tcsetsize(), tcgetsize() เพื่อรับ/ตั้งค่าขนาดหน้าต่างเทอร์มินัล" ตัวติดตามข้อบกพร่องของ กลุ่มAustin ออสติน กรุ๊ป. สืบค้นเมื่อ 12 ตุลาคม 2560 . ได้รับการยอมรับว่าถูกทำเครื่องหมาย
  22. "IEEE Std 1003.1-2017 - ฆ่า" IEEE, กลุ่มเปิดความสอดคล้องระหว่างค่าจำนวนเต็มและ ค่า sigที่ใช้แสดงอยู่ในรายการต่อไปนี้ ผลกระทบของการระบุsignal_number ใดๆ นอกเหนือจากที่ระบุไว้ด้านล่างนี้ไม่ได้ถูกกำหนดไว้
  23. ↑ abc "signal(7) — หน้าคู่มือ Linux" manpages.courier-mta.org ​สืบค้นเมื่อ 22 พฤศจิกายน 2561 .
  24. "Linux 3.0 x86_64: SIGSTKFLT จะเพิ่มขึ้นเมื่อใด" สแต็คโอเวอร์โฟลว์

ลิงค์ภายนอก

  • ตารางสัญญาณ Unix, Ali Alanjawi, มหาวิทยาลัยพิตต์สเบิร์ก
  • Man7.org สัญญาณหน้าคน
  • รู้เบื้องต้นเกี่ยวกับการเขียนโปรแกรมสัญญาณ Unix รู้เบื้องต้นเกี่ยวกับการเขียนโปรแกรมสัญญาณ Unix ที่Wayback Machine (เก็บถาวร 26 กันยายน 2013)
  • บทนำอีกประการหนึ่งของการเขียนโปรแกรมสัญญาณ Unix (โพสต์บล็อก, 2009)
  • UNIX และสัญญาณ POSIX ที่เชื่อถือได้โดย Baris Simsek (จัดเก็บโดยInternet Archive )
  • ตัวจัดการสัญญาณโดย Henning Brauer
Retrieved from "https://en.wikipedia.org/w/index.php?title=Signal_(IPC)&oldid=1217003461#SIGKILL"