Apa perbedaan antara Ctrl-z dan Ctrl-c di terminal?

120

Adakah yang bisa memberi tahu saya perbedaan antara ctrl+ zdan ctrl+ c?

Ketika saya berada di terminal, kedua kombinasi menghentikan proses saat ini, tetapi apa sebenarnya perbedaan antara keduanya?

chaitanya lakkundi
sumber
Saya telah mengajukan pertanyaan yang sangat mirip di sini: unix.stackexchange.com/questions/116959/…
ThorSummoner
ya saya berhasil memahami perbedaan antara keduanya !!
chaitanya lakkundi
Satu hal yang ingin saya tambahkan di sini, Bahwa sebagian besar pria (dalam lingkaran profesional saya juga) tidak membedakan antara mereka. Dan digunakan opsi CTRL-Z untuk mengakhiri perintah. Yang merupakan praktik yang salah. Anda harus menggunakan CTRL-C pada semua instance ini. Sebagai CTRL-Z cukup diletakkan di latar belakang. Jadi proses tidak dihentikan sampai selesai, Yang mungkin bukan keinginan Pengguna (sebagian besar waktu) ketika ia menekan CTRL-Z untuk mengakhiri.
kuldeep.kamboj

Jawaban:

156

Jika kita membiarkan case edge ke satu sisi, perbedaannya sederhana. Control+ Cmembatalkan aplikasi segera sementara Control+ Zmendorongnya ke latar belakang, ditangguhkan.

Shell mengirim sinyal berbeda ke aplikasi yang mendasarinya pada kombinasi ini:

  • Control+ C(karakter kontrol intr) mengirimkan SIGINT yang akan mengganggu aplikasi. Biasanya menyebabkannya dibatalkan, tetapi ini tergantung pada aplikasi untuk memutuskan.

  • Control+ Z(karakter kontrol susp) mengirim SIGTSTP ke aplikasi latar depan, secara efektif meletakkannya di latar belakang, ditangguhkan. Ini berguna jika Anda perlu keluar dari sesuatu seperti editor untuk pergi dan mengambil beberapa data yang Anda butuhkan. Anda dapat kembali ke aplikasi dengan menjalankan fg(atau di %xmana xnomor pekerjaan seperti yang ditunjukkan pada jobs).

    Kita dapat menguji ini dengan menjalankan nano TEST, lalu menekan Control+ Zdan kemudian menjalankan ps aux | grep TEST. Ini akan menunjukkan kepada kita nanoproses masih berjalan:

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

    Lebih lanjut, kita dapat melihat (dari T itu, yang ada di kolom status) bahwa proses telah dihentikan . Jadi masih hidup, tapi tidak berjalan ... Itu bisa dilanjutkan.

    Beberapa aplikasi akan macet jika mereka memiliki proses eksternal yang sedang berlangsung (seperti permintaan web) yang mungkin habis saat mereka tertidur.

Oli
sumber
51
Perlu ditambahkan bahwa juga dimungkinkan untuk menjalankan bg(bukan fg) untuk membatalkan penangguhan aplikasi yang telah Ctrl + Z'ed tanpa memasukkannya kembali ke latar depan; secara efektif memberi Anda kontrol dari kedua shell yang memulai aplikasi dan aplikasi itu sendiri, seolah-olah Anda telah digunakan &saat memulai aplikasi. Ini sering berguna ketika Anda lupa memulainya dengan &:)
Malte Skoruppa
6
Dan Anda dapat kembali ke proses itu dengan mengetik fglagi!
sleblanc
4
Jika ada beberapa pekerjaan yang ditangguhkan atau di latar belakang: "pekerjaan" daftarkan mereka, dan "fg% n" atau "bg% n" atau bahkan "bunuh% n" untuk meletakkan pekerjaan% n di latar depan, latar belakang, atau bunuh .
Olivier Dulac
3
@ Oli: Paragraf kedua Anda mengatakan, "Shell mengirim [s] ... sinyal ke aplikasi yang mendasarinya ...." Tidak, sistem operasi / driver terminal mengirimkan sinyal. (Dalam sistem jendela, pengelola jendela dapat memainkan peran.) Selain itu, agar lengkap (meskipun di luar cakupan pertanyaan awal), Anda mungkin ingin menyebutkan Ctrl + \.
Scott
Bagaimana sesi tahu kelompok proses mana yang harus kembali ke latar depan setelah melakukan salah satu ctrl catau ctrl z? Ini default ke SID (bash)?
jiggunjer
16

Control+ Zmenunda proses ( SIGTSTP) dan Control+ Cmemotong proses ( SIGINT)

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

Pada sistem mirip Unix, Control + Z adalah pemetaan keyboard default paling umum untuk urutan kunci yang menunda proses

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

Dalam sistem POSIX, urutan menyebabkan program aktif menerima sinyal SIGINT. Jika program tidak menentukan bagaimana menangani kondisi ini, itu dihentikan. Biasanya program yang menangani SIGINT masih akan berhenti sendiri, atau setidaknya menghentikan tugas yang berjalan di dalamnya

Kurang tidur Bulbasaur
sumber
1
Referensi postingan pekerjaan yang bagus. Tetapi secara umum, Wikipedia bukanlah sumber referensi teknis yang sangat baik.
Aaron
3
@ BryceAtNetwork23 itu sangat benar; Saya merasa dalam hal ini definisi Wikipedia sudah cukup memadai. Saya akan mencari lebih banyak referensi teknis di masa depan!
Sleep Deprived Bulbasaur
14

Ctrl+ Cdigunakan untuk membunuh proses dengan sinyal SIGINT, dengan kata lain + adalah pembunuhan yang sopan .

Ctrl+ Z digunakan untuk menunda proses dengan mengirimkannya sinyal SIGTSTP, yang seperti sinyal tidur, yang dapat dibatalkan dan proses dapat dilanjutkan kembali.

Namun ketika suatu proses ditangguhkan, kita dapat melanjutkannya kembali dengan fg(melanjutkan di latar depan) dan bg(melanjutkan di latar belakang), tetapi saya tidak dapat melanjutkan proses yang terbunuh, itu adalah perbedaan antara menggunakan Ctrl+ C& Ctrl+ Z.

Bagaimana kita bisa melihat proses yang ditangguhkan?

The jobsperintah memberikan output seperti ini:

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

Bagaimana cara membunuh proses yang ditangguhkan di latar belakang?

Dengan menggunakan killperintah:

kill %ndi mana nnomor ditampilkan oleh jobsperintah. Jadi jika saya ingin membunuh kucing: kill %1.

nux
sumber
1
sesuai dengan komentar lain di utas ini, koreksi: ctrl-z mengirimkan sinyal SIGTSTP bukan SIGSTOP.
suam
Bunuh% 1 memberitahu saya - Operasi tidak diizinkan. Kenapa begitu? Terima kasih
Satya Prakash
7

Untuk membuatnya lebih sederhana:

  • CTRL-C meminta agar program dibatalkan .

  • CTRL-Z Memaksa program untuk menangguhkan dan pergi ke latar belakang .

    Ini memungkinkan Anda untuk melanjutkannya nanti dengan perintah fg. Tugas latar belakang yang tersisa terbunuh saat Anda keluar dari shell login.

thomasrutter
sumber
5

Ini akan membantu

Ctrl+ Zdigunakan untuk menangguhkan proses dengan mengirimkannya sinyal SIGSTOP, yang tidak dapat dicegat oleh program. Sedangkan Ctrl+ Cdigunakan untuk mematikan proses dengan sinyal SIGINT, dan dapat dicegat oleh suatu program sehingga dapat membersihkan dirinya sendiri sebelum keluar, atau tidak keluar sama sekali.

Graham
sumber
4
Ini tidak sepenuhnya benar. Mengirimnya SIGTSTP, yang dapat ditangkap oleh program. Ada empat sinyal yang berbeda, yang dapat menangguhkan program SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU. Dari mereka hanya SIGSTOPtidak bisa diblokir. Tiga lainnya digunakan oleh terminal untuk menghentikan proses dalam kondisi yang berbeda.
kasperd
4

ketika Anda menekan ctrl+ c, itu berarti Anda mengirim SIGINT ke proses Anda. seperti Anda ketik perintah ini: kill -SIGINT <your_pid>. Ini akan membunuh Anda proses Anda. Itu sebabnya Anda tidak dapat melihatnya saat mengeluarkan perintah ps .
Ketika Anda menekan ctrl+ z, itu berarti Anda mengirim SIGSTOP ke proses Anda. seperti Anda ketik perintah ini: kill -SIGKSTOP <your_pid>. Ini akan menghentikan proses Anda, tetapi prosesnya masih hidup. Jadi Anda dapat mengaktifkan kembali proses Anda dengan mengirimkan SIGCONT ke proses Anda.

MERACUNI
sumber