SIGINT (ctrl-c) ไม่ใช่การ ping ในทันที


0

ในช่วงเวลาที่ผมทำงานpingคำสั่ง (บน GNU / Linux) Ctrl-cและมันจะไม่หยุดทันทีเมื่อกด

เพื่อความเข้าใจของฉัน ctrl-c ส่ง SIGINT สาเหตุที่เป็นไปได้ของpingคำสั่งที่จะไม่ออกในทันทีคืออะไร?

ฉันจะทำอย่างไรเพื่อให้แน่ใจว่าจะออกจากทันทีเสมอ

คำตอบ:


3

โปรแกรมสามารถผูกตัวจัดการแบบกำหนดเองกับสัญญาณ 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 ควรออก ธงนี้มีการตรวจสอบในสอง แห่งเท่านั้น ฉันเดาว่าการโทรหนึ่งในระบบที่ใช้มีการบล็อกหรือใช้เวลาในการส่งคืนดังนั้นการตั้งค่าสถานะจะไม่ถูกตรวจสอบหรือหลังจากล่าช้า


1
คุณกำลังแนะนำว่า ping ผูกตัวจัดการแบบกำหนดเองกับสัญญาณ SIGINT ถึงกระนั้นฉันก็ชอบที่จะรู้ว่าสิ่งที่ฉันสามารถตรวจสอบเพื่อติดตามสาเหตุของพฤติกรรมนี้
silviot

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