ในช่วงเวลาที่ผมทำงานping
คำสั่ง (บน GNU / Linux) Ctrl-c
และมันจะไม่หยุดทันทีเมื่อกด
เพื่อความเข้าใจของฉัน ctrl-c ส่ง SIGINT สาเหตุที่เป็นไปได้ของping
คำสั่งที่จะไม่ออกในทันทีคืออะไร?
ฉันจะทำอย่างไรเพื่อให้แน่ใจว่าจะออกจากทันทีเสมอ
ในช่วงเวลาที่ผมทำงานping
คำสั่ง (บน GNU / Linux) Ctrl-c
และมันจะไม่หยุดทันทีเมื่อกด
เพื่อความเข้าใจของฉัน ctrl-c ส่ง SIGINT สาเหตุที่เป็นไปได้ของping
คำสั่งที่จะไม่ออกในทันทีคืออะไร?
ฉันจะทำอย่างไรเพื่อให้แน่ใจว่าจะออกจากทันทีเสมอ
คำตอบ:
โปรแกรมสามารถผูกตัวจัดการแบบกำหนดเองกับสัญญาณ SIGINT ตัวอย่างเช่นทำการดำเนินการล้างข้อมูล คุณสามารถสังเกตพฤติกรรมนี้ด้วยเชลล์สคริปต์นี้ซึ่งผูกตัวจัดการโดยใช้กับดัก:
#!/bin/bash
trap "echo Caught!" SIGINT SIGTERM
while true
do sleep 60
done
หากต้องการฆ่าโปรแกรมเชิงโต้ตอบทันทีคุณสามารถทำkill -9 <PID>
ในเชลล์อื่นหรือใช้ ctrl-Z เพื่อหยุดโปรแกรมชั่วคราวและฆ่ามัน:
❯ /tmp/test.sh # Our test script with trap
^CCaught! # Ctrl-c doesn't work
^Z # Suspend the process
[1] + 11713 suspended /tmp/test.sh
❯ kill -9 %1
[1] + 11713 killed
ที่นี่ฉันใช้% 1 เพื่อรับ pid ของกระบวนการพื้นหลังแรกซึ่งเป็นสคริปต์เพราะฉันไม่มีกระบวนการพื้นหลังอื่น ๆ ในตัวอย่างนี้ คุณยังสามารถใช้ PID ของกระบวนการโดยตรงสำหรับเชลล์ที่ไม่สนับสนุนไวยากรณ์% 1
และนั่นคือสิ่งที่ ping ทำได้แค่ดูซอร์สโค้ด : ในฟังก์ชั่นหลักการตั้งค่าจะถูกเรียกซึ่งตั้งค่าตัวจัดการสัญญาณรวมถึง SIGINT SIGINT ถูกผูกไว้กับsigexitซึ่งกำหนดค่าสถานะเพื่อแจ้ง mainloop ว่า ping ควรออก ธงนี้มีการตรวจสอบในสอง แห่งเท่านั้น ฉันเดาว่าการโทรหนึ่งในระบบที่ใช้มีการบล็อกหรือใช้เวลาในการส่งคืนดังนั้นการตั้งค่าสถานะจะไม่ถูกตรวจสอบหรือหลังจากล่าช้า