การกด ctrl-c หลาย ๆ ครั้งทำให้โปรแกรมที่กำลังรันปิดเร็วขึ้นหรือไม่?


41

ฉันมักจะเริ่มอ่านไฟล์ขนาดใหญ่แล้วต้องการออกหลังจากนั้นไม่นาน แต่มีความล่าช้าในการกด
Ctrl+ Cเพื่อหยุดโปรแกรม มีโอกาสที่จะลดความล่าช้าโดยการกดปุ่มCtrl+ Cหลาย ๆ ครั้งหรือไม่? หรือฉันจะสูญเสียการกดคีย์ของฉัน


ฉันสังเกตว่าเมื่อเรียกใช้กระบวนการที่เรียกใช้กระบวนการลูกหลาย ๆ ครั้งบางครั้ง Ctrl-C จะขัดจังหวะเด็กที่กำลังทำงาน แต่ไม่ใช่กระบวนการหลัก นั่นเป็นความจริงbashแต่ไม่ใช่ในกรณีzshที่ปิดพาเรนต์เสมอ zshมันเป็นหนึ่งในเหตุผลที่ผมชอบ
joeytwiddle

17
ใช่เช่นเดียวกับการกดปุ่มลิฟต์หรือปุ่มข้ามเดินซ้ำ ๆ จะทำให้ลิฟต์มาเร็วขึ้นหรือแสงเปลี่ยนเป็นสีเขียวเร็วขึ้น
Michael

3
ใช่เช่นเดียวกับปุ่มลิฟต์และทางม้าลาย CTRL-C ยังสามารถเหนียวหรือเป็นสนิมหรือพัฒนาการเชื่อมต่อที่ไม่แน่นอน การกดหลายครั้งเป็นวิธีที่ดีเพราะกดเพียงครั้งเดียวเท่านั้นจึงต้องลงทะเบียนสำหรับลิฟท์ที่จะมาถึงป้ายเดินเพื่อให้แสงสว่างหรือโปรแกรมที่จะปิด
hippietrail

1
@hippietrail แต่เปลือกของคุณจะพิมพ์ออกมา^Cเมื่อมันลงทะเบียนสื่อมวลชน (อย่างน้อยทุบตีไม่)
wchargin

1
สำหรับสิ่งที่คุ้มค่าฉันไม่คิดว่ามันจะทำให้สูญเสียการกดแป้น - ฉันคิดว่ามันทำให้เกิดความคับข้องใจในแบบที่ไม่ทำลาย (ฉันมักจะตีมัน 2-3 ครั้ง แต่ที่บางส่วนเพราะฉัน "เติบโตขึ้นมาบน" ขั้วที่แนบมาผ่านสายโทรศัพท์ที่คุณสามารถไม่เคยนับบนทุกกดแป้นพิมพ์เดียวถึงเครื่อง.)
keshlam

คำตอบ:


35

หลังจากครั้งแรกCtrl-Cโปรแกรมจะได้รับSIGINTและมักจะเริ่มล้างข้อมูล (การลบไฟล์ tmp ปิดซ็อกเก็ต ฯลฯ ) หากคุณกดปุ่มCtrl-Cอีกครั้งในขณะที่กำลังเกิดขึ้นอาจเกิดขึ้นได้ว่าคุณขัดจังหวะรูทีนการล้างข้อมูล (เช่นสัญญาณเพิ่มเติมอาจถูกดำเนินการแทนการถูกทิ้งไว้ตามลำพัง) ทำให้เกิดความยุ่งเหยิง แม้ว่าปกติแล้วจะไม่ใช่กรณีนี้ แต่โดยทั่วไปแล้วสัญญาณเพิ่มเติมจะถูกส่งหลังจากนั้นกระบวนการเสร็จสิ้น (เนื่องจากความล่าช้าโดยธรรมชาติในการโต้ตอบของผู้ประกอบการกับระบบ) นั่นหมายความว่ากระบวนการอื่นได้รับสัญญาณ (มักจะเป็น shell แต่ไม่เสมอไป) หากผู้รับรายนั้นจัดการสัญญาณไม่ถูกต้อง (เช่นเชลล์มักจะทำ - ดูคำตอบของ Jenny D) คุณอาจประหลาดใจอย่างไม่พอใจกับผลลัพธ์ของการกระทำดังกล่าว


ทำไมมันควรขัดจังหวะกิจวัตรการล้างข้อมูล? เป็นเพียงสัญญาณอื่นINTที่กระบวนการได้รับ
ความโกลาหล

4
@chaos ทำไมมันควร? ควรถ้ารูทีนการล้างได้หยุดและคุณต้องการหยุด ใช้งานได้จริงหรือ? ใช่ค่อนข้างบ่อย คุณสามารถแสดงให้เห็นถึงมันก็พอ: trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10ทำให้สคริปต์ทุบตีด้วยบรรทัดเดียว รันสคริปต์และกด ctrl-C สองครั้ง คุณจะเห็นว่า ctrl-C อันที่สองถูกส่งผ่านไปยังรูทีน "clean up" (ในคำสั่ง trap) และยุติsleepคำสั่ง
John1024

1
@ John1024 อ่าตอนนี้ฉันเห็นแล้ว ขอบคุณสำหรับตัวอย่างสคริปต์ ^^ แต่การล้างข้อมูลไม่ได้ถูกยกเลิกโปรดดู: trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10เป็นเพียงsleepคำสั่งที่รับสัญญาณ เราผิดทั้งคู่ xD
วุ่นวาย

2
นั่นไม่ถูกต้อง การส่งสัญญาณเป็นแบบซิงโครนัส หากisigเปิดใช้งานทันทีที่กดปุ่ม CTRL-C และรับโดยเคอร์เนล (สำหรับเทอร์มินัลอีมูเลเตอร์เมื่อเทอร์มินัลอีมูเลเตอร์เขียนไปยังด้านต้นแบบของเทอร์มินัลหลอก) สัญญาณ SIGINT จะถูกส่งไปยัง กระบวนการในกลุ่มกระบวนการเบื้องหน้าของเทอร์มินัล อาจถูกบล็อกที่นั่น แต่จะไม่ถูกส่งไปยังกระบวนการอื่นในภายหลัง แม้ว่าบัฟเฟอร์อุปกรณ์เทอร์มินัลจะเต็ม (แอปพลิเคชันยังไม่ได้อ่านสิ่งที่คุณพิมพ์) CTRL-C จะข้ามคิว
Stéphane Chazelas

1
ใช่เป็นตัวอย่าง VLC ตีความสัญญาณ Ctrl + C หลายวิธีเพื่อออกจากสิ่งที่ไม่สะอาดในขณะที่ Ctrl + C เดียวจะพยายามออกจากอย่างหมดจด
Jeremy Visser

11

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

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 

6
กระบวนการไม่จำเป็นต้องออกจากเมื่อส่ง SIGINT มันสามารถมีชีวิตอยู่อย่างไม่มีกำหนดและทำสิ่งที่แตกต่างทุกครั้งที่กด Ctrl + C
Brian Gordon

จริง ฉันตั้งสมมติฐานเกี่ยวกับวิธีที่ผู้ใช้อ่านไฟล์
Jenny D

5

คำตอบสั้น ๆ : หากกระบวนการทำปฏิกิริยากับมัน

คำตอบยาว : เมื่อคุณกดctrl+ cเคอร์เนลจะส่งสัญญาณไปยังกระบวนการ สัญญาณใดที่สามารถพิจารณาได้จากคำสั่งต่อไปนี้:

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

ดูหน้าคนของstty:

   intr CHAR
          CHAR will send an interrupt signal

มันเป็นสัญญาณINTหรือที่เรียกว่าหมายเลข 2 เมื่อกระบวนการมีตัวจัดการสัญญาณมันสามารถตอบสนองต่อสิ่งนี้ กระบวนการส่วนใหญ่ทำหน้าที่ล้างข้อมูลให้เสร็จสิ้น


Ctrl-Z มักจะส่ง SIGTSTP ซึ่งสามารถจัดการได้ (ต่างจาก SIGSTOP)
เตอร์

4
ไม่มันไม่ใช่เชลล์ที่ส่ง SIGINT ไปยังกระบวนการ มันคือkernel(วินัยในสายของเทอร์มินัลไดรเวอร์ของเทอร์มินัล) ที่ส่ง SIGINT ไปยังทุกกระบวนการในกลุ่มกระบวนการพื้นหน้าของเทอร์มินัล
Stéphane Chazelas

ผู้อ่านในอนาคตนอกจากนี้ยังเห็นunix.stackexchange.com/a/120071/135943
Wildcard

4

คุณถูก. การกดปุ่มถูกทำลาย เมื่อคุณกดCrtl+Cและเครื่องจะได้รับการตรวจพบว่ามีทรัพยากรที่จำเป็นต้องทำการล้างซึ่งเป็นสาเหตุที่ทำให้ต้องใช้เวลา กรณีที่เป็นไปได้หนึ่งอย่างที่ฉันรู้ว่าCtrl+Cต้องใช้การกดคือเมื่อคุณต้องการยกเลิกกระบวนการอัปเดตของยัมโดยที่ยัมต้องการให้คุณกดCtrl+Cสองครั้งเพื่อยืนยันว่าคุณต้องการยกเลิกจริงๆ


2

แม้ว่าจะมีเพียงสิ่งเดียวที่Ctrl-Cจำเป็นในกรณีทั่วไป แต่ก็มีบางสถานการณ์ที่อาจจำเป็น Python ตัวอย่างเช่นกับดักCtrl-Cเมื่อเธรดใหม่ถูกวางไข่และดังนั้นหากมีสิ่งผิดปกติในระหว่างการเริ่มเธรดจำนวนมากจำเป็นต้องส่งซ้ำหลายครั้งเพื่อให้ผ่านpythonกระบวนการพาเรนต์โดยไม่ต้อง จับ


1
สิ่งนี้เกิดขึ้นกับฉันในตอนนี้และเมื่อฉันสร้างสคริปต์ python แบบมัลติเธรด / ประมวลผล บางครั้งต้องกดหลายครั้งก่อนที่กระบวนการหลักจะถูกฆ่า
Leo

0

ฉันมักจะต้องกดCtrlcหลายครั้ง ฉันไม่เคยตอบสนองเมื่อกดครั้งแรกและต้องใช้มันหลายครั้งจนกว่าระบบจะรู้ตัวว่ามีCtrlcการส่ง ดูเหมือนว่าจริงแล้วมันคิดถึง / เสียส่วนใหญ่ไป

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