ความแตกต่างระหว่าง Ctrl-z และ Ctrl-c ในเทอร์มินัลคืออะไร?


120

มีใครบอกความแตกต่างระหว่างctrl+ zและctrl+ ได้cไหม

เมื่อฉันอยู่ในเทอร์มินัลชุดค่าผสมทั้งสองหยุดกระบวนการปัจจุบัน แต่อะไรคือความแตกต่างระหว่างทั้งสองอย่างแน่นอน


ฉันถามคำถามที่คล้ายกันมากที่นี่: unix.stackexchange.com/questions/116959/ …
ThorSummoner


ใช่ฉันประสบความสำเร็จในการทำความเข้าใจความแตกต่างระหว่างทั้งสอง !!
chaitanya lakkundi

สิ่งหนึ่งที่ฉันต้องการเพิ่มที่นี่ส่วนใหญ่ของผู้ชาย (ในวงมืออาชีพของฉันด้วย) ไม่ได้แยกความแตกต่างระหว่างพวกเขา และใช้ตัวเลือก CTRL-Z เพื่อยกเลิกคำสั่ง ซึ่งเป็นการฝึกฝนที่ผิด คุณต้องใช้ CTRL-C ในทุกกรณี ในฐานะที่เป็น CTRL-Z เพียงแค่ใส่พื้นหลัง ดังนั้นกระบวนการจะไม่สิ้นสุดจนกว่าจะเสร็จซึ่งอาจไม่เป็นที่ต้องการของผู้ใช้ (ส่วนใหญ่) เมื่อเขากด CTRL-Z เพื่อยกเลิก
kuldeep.kamboj

คำตอบ:


155

ถ้าเราปล่อยให้กรณีขอบไปด้านหนึ่งความแตกต่างนั้นง่าย Control+ Cยกเลิกแอปพลิเคชันเกือบจะทันทีในขณะที่Control+ Zสับมันเป็นพื้นหลังถูกระงับ

เชลล์ส่งสัญญาณที่แตกต่างกันไปยังแอ็พพลิเคชันพื้นฐานในชุดค่าผสมเหล่านี้:

  • Control+ C(อักขระควบคุมintr) ส่ง SIGINT ซึ่งจะขัดจังหวะแอปพลิเคชัน มักจะทำให้มันยกเลิก แต่มันขึ้นอยู่กับแอปพลิเคชันที่จะตัดสินใจ

  • Control+ Z(อักขระควบคุมsusp) ส่ง SIGTSTP ไปยังแอปพลิเคชันเบื้องหน้าโดยวางไว้ในพื้นหลังอย่างมีประสิทธิภาพ สิ่งนี้มีประโยชน์หากคุณต้องการแยกบางอย่างเช่นเครื่องมือแก้ไขเพื่อไปและหยิบข้อมูลที่คุณต้องการ คุณสามารถกลับไปลงในใบสมัครโดยการเรียกใช้fg(หรือ%xที่xเป็นจำนวนงานที่แสดงในjobs)

    เราสามารถทดสอบโดยการทำงานnano TESTแล้วกดControl+ แล้วทำงานZ ps aux | grep TESTนี่จะแสดงให้เราเห็นว่าnanoกระบวนการยังคงทำงานอยู่:

    oli     3278  0.0  0.0  14492  3160 pts/4    T    13:59   0:00 nano TEST
    

    นอกจากนี้เราสามารถมองเห็น (จาก T ที่ซึ่งอยู่ในคอลัมน์สถานะ) ที่ผลิตตามกระบวนการได้หยุด ดังนั้นมันจึงยังมีชีวิตอยู่ แต่มันไม่ทำงาน ... สามารถกลับมาทำงานต่อได้

    บางแอปพลิเคชันจะทำงานล้มเหลวหากพวกเขามีกระบวนการภายนอกที่ดำเนินอยู่ (เช่นคำขอทางเว็บ) ซึ่งอาจหมดเวลาขณะที่พวกเขากำลังหลับ


51
มีมูลค่าเพิ่มที่เป็นไปได้ที่จะเรียกใช้bg(แทนfg) เพื่อยกเลิกการระงับแอปพลิเคชันที่ได้รับ Ctrl + Z โดยไม่ต้องใส่กลับเข้าไปในเบื้องหน้า ให้คุณควบคุมทั้งเชลล์ที่เริ่มต้นแอปพลิเคชันและแอปพลิเคชันได้อย่างมีประสิทธิภาพราวกับว่าคุณใช้&เมื่อเริ่มต้นแอปพลิเคชัน สิ่งนี้มักจะมีประโยชน์เมื่อคุณลืมที่จะเริ่มต้นด้วย&:)
Malte Skoruppa

6
และคุณสามารถกลับไปที่กระบวนการนั้นโดยพิมพ์fgอีกครั้ง!
sleblanc

4
ในกรณีที่มีงานหลายงานที่ถูกระงับหรืออยู่เบื้องหลัง: "งาน" แสดงรายการงานเหล่านั้นและ "fg% n" หรือ "bg% n" หรือแม้กระทั่ง "kill% n" เพื่อวางงาน% n ในเบื้องหน้าพื้นหลังหรือฆ่ามัน .
Olivier Dulac

3
@Oli: ย่อหน้าที่สองของคุณบอกว่า“ เชลล์ส่งสัญญาณ [s] …ไปยังแอปพลิเคชันที่ต้องใช้….” ไม่ระบบปฏิบัติการ / ไดรเวอร์เทอร์มินัลส่งสัญญาณ (ในระบบหน้าต่างตัวจัดการหน้าต่างอาจมีบทบาท) นอกจากนี้เพื่อให้สมบูรณ์ (แม้ว่าจะอยู่นอกเหนือขอบเขตของคำถามเดิม) คุณอาจต้องการพูดถึง Ctrl + \
สกอตต์

วิธีการที่ไม่เซสชั่นทราบว่ามีกลุ่มกระบวนการที่จะกลับไปเบื้องหน้าหลังจากทำอย่างใดอย่างหนึ่งctrl cหรือctrl z? มันเป็นค่าเริ่มต้นไปที่ SID (ทุบตี)?
jiggunjer

16

Control+ Zหยุดกระบวนการชั่วคราว( SIGTSTP) และControl+ Cขัดจังหวะกระบวนการ ( SIGINT)

http://en.wikipedia.org/wiki/Control-Z

บนระบบที่คล้าย Unix Control + Z คือการแม็พคีย์บอร์ดเริ่มต้นที่พบมากที่สุดสำหรับลำดับคีย์ที่ระงับกระบวนการ

http://en.wikipedia.org/wiki/Control-C

ในระบบ POSIX ลำดับจะทำให้โปรแกรมที่ใช้งานได้รับสัญญาณ SIGINT หากโปรแกรมไม่ได้ระบุวิธีจัดการกับเงื่อนไขนี้จะถูกยกเลิก โดยทั่วไปโปรแกรมที่จัดการกับ SIGINT จะยังคงยุติตัวเองหรืออย่างน้อยก็ยุติงานที่กำลังทำงานอยู่ภายใน


1
งานโพสต์อ้างอิงที่ดี แต่โดยทั่วไปแล้ววิกิพีเดียไม่ได้เป็นแหล่งอ้างอิงทางเทคนิคที่ดีนัก
แอรอน

3
@ BryceAtNetwork23 ที่เป็นจริงมาก ฉันรู้สึกว่าในกรณีนี้คำจำกัดความของ Wikipedia นั้นเพียงพอเพียงพอ ฉันจะค้นหาข้อมูลอ้างอิงทางเทคนิคเพิ่มเติมในอนาคตแม้ว่า!
Bulbasaur ปราศจากการนอนหลับ

13

Ctrl+ Cจะใช้ในการฆ่ากระบวนการที่มีสัญญาณSIGINTในคำอื่น ๆ มันเป็นความสุภาพฆ่า

Ctrl+ Z ใช้เพื่อหยุดกระบวนการโดยส่งสัญญาณSIGTSTPซึ่งเป็นเหมือนสัญญาณสลีปที่สามารถเลิกทำได้และกระบวนการสามารถกลับมาทำงานอีกครั้งได้

แต่เมื่อกระบวนการที่ถูกระงับเราสามารถดำเนินการได้อีกครั้งโดยfg(ประวัติส่วนตัวในหน้า) และbg(ประวัติการทำงานในพื้นหลัง) แต่ฉันไม่สามารถกลับมาเป็นกระบวนการที่ถูกฆ่าตายที่เป็นความแตกต่างระหว่างการใช้Ctrl+ C& +CtrlZ

เราจะดูกระบวนการที่ถูกระงับได้อย่างไร

jobsคำสั่งให้การส่งออกเช่นนี้

[1]-  Stopped                 cat
[2]+  Stopped                 vi

จะฆ่ากระบวนการที่ถูกระงับเป็นเบื้องหลังได้อย่างไร

โดยใช้killคำสั่ง:

kill %nโดยที่nเป็นตัวเลขที่แสดงโดยjobsคำสั่ง kill %1ดังนั้นถ้าฉันต้องการที่จะฆ่าแมว:


1
ตามความเห็นอื่น ๆ ในหัวข้อนี้การแก้ไข: ctrl-z ส่งสัญญาณ SIGTSTP ไม่ใช่ SIGSTOP
lukewendling

ฆ่า% 1 บอกฉัน - ไม่อนุญาตให้ใช้งาน ทำไมเป็นเช่นนั้น ขอบคุณ
Satya Prakash

7

หากต้องการใส่เพียง:

  • CTRL-Cการร้องขอว่าโปรแกรมยกเลิก

  • CTRL-Zบังคับให้โปรแกรมที่จะระงับและไปเป็นพื้นหลัง

    fgนี้ช่วยให้คุณกลับมาได้ในภายหลังมีคำสั่ง ภารกิจเบื้องหลังที่เหลืออยู่จะถูกฆ่าเมื่อคุณออกจากเชลล์การเข้าสู่ระบบ


5

สิ่งนี้น่าจะช่วยได้

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


4
สิ่งนี้ไม่ถูกต้องทั้งหมด มันส่งSIGTSTPซึ่งโปรแกรมสามารถจับได้ มีสี่สัญญาณที่แตกต่างกันซึ่งสามารถระงับโปรแกรมที่มีSIGSTOP, SIGTSTP, ,SIGTTIN SIGTTOUของเหล่านั้นเท่านั้นSIGSTOPไม่สามารถถูกบล็อก อีกสามคนถูกใช้โดย terminal เพื่อหยุดกระบวนการภายใต้เงื่อนไขที่แตกต่างกัน
kasperd

4

เมื่อคุณกดctrl+ cหมายความว่าคุณส่ง SIGINT ไปยังกระบวนการของคุณ เหมือนที่คุณพิมพ์คำสั่งนี้: kill -SIGINT <your_pid>. มันจะฆ่าคุณกระบวนการของคุณ นั่นเป็นเหตุผลว่าทำไมคุณไม่เห็นมันเมื่อออกคำสั่งps
เมื่อคุณกดctrl+ zหมายความว่าคุณส่ง SIGSTOP ไปยังกระบวนการของคุณ เหมือนที่คุณพิมพ์คำสั่งนี้: kill -SIGKSTOP <your_pid>. มันจะหยุดกระบวนการของคุณ แต่กระบวนการยังมีชีวิตอยู่ เพื่อให้คุณสามารถเปิดใช้งานกระบวนการของคุณอีกครั้งโดยส่ง SIGCONT ไปยังกระบวนการของคุณ

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