ฉันรู้สึกประหลาดใจกับความคิดเห็นนี้ในคำถามอื่น:
การส่งสัญญาณ USR1 ในไม่ช้าหลังจากเริ่มต้น (เช่นในสคริปต์ทุบตีบรรทัดหลังจากที่คุณเริ่มต้น) จะเป็นการยกเลิกสัญญาณ
ใครสามารถอธิบายได้ว่าทำไม ?
ฉันรู้สึกประหลาดใจกับความคิดเห็นนี้ในคำถามอื่น:
การส่งสัญญาณ USR1 ในไม่ช้าหลังจากเริ่มต้น (เช่นในสคริปต์ทุบตีบรรทัดหลังจากที่คุณเริ่มต้น) จะเป็นการยกเลิกสัญญาณ
ใครสามารถอธิบายได้ว่าทำไม ?
คำตอบ:
แต่ละสัญญาณมี "การจัดการเริ่มต้น" - กระบวนการจะทำตามค่าเริ่มต้นเมื่อได้รับสัญญาณนั้น มีตารางในsignal(7)
หน้ารายชื่อพวกเขา:
Signal Value Action Comment
──────────────────────────────────────────────────────────────────────
...
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGUSR1
และSIGUSR2
ทั้งคู่มีการดำเนินการเริ่มต้นTerm
- กระบวนการถูกยกเลิก dd
ลงทะเบียนตัวจัดการเพื่อสกัดสัญญาณและทำสิ่งที่มีประโยชน์กับมัน แต่ถ้าคุณส่งสัญญาณเร็วเกินไปก็ไม่มีเวลาลงทะเบียนตัวจัดการนั้นดังนั้นการกระทำเริ่มต้นจึงเกิดขึ้นแทน
strace
ในเชลล์สคริปต์…)
{ dd if=/dev/zero of=/dev/null & }; kill -USR1 $!; jobs; sleep 1; jobs
ต่อไปนี้เพื่อสร้างเอฟเฟกต์ที่คุณกำลังอธิบาย