Apa perbedaan antara Ctrl + Z dan Ctrl + C di baris perintah Unix?

189

Saya menggunakan Terminal Mac OS X. Dan saya menggunakan Ctrl+ Zatau Ctrl+ Cuntuk menghentikan beberapa program. Tetapi saya menyadari bahwa saya tidak tahu apa yang sebenarnya mereka lakukan. Apa mereka dan apa perbedaan di antara mereka?

Pertanyaan ini adalah Pertanyaan Pengguna Super Minggu Ini .
Baca entri blog 13 Maret 2011 untuk perincian lebih lanjut atau kirimkan Pertanyaan Anda Minggu Ini.

Eonil
sumber

Jawaban:

251

Control+ Zdigunakan untuk menunda proses dengan mengirimkannya sinyal SIGSTOP, yang tidak dapat dicegat oleh program. Sedangkan Control+ 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.

Jika Anda menunda proses, ini akan muncul di shell untuk memberi tahu Anda telah ditangguhkan:

[1]+  Stopped                 yes

Namun, jika Anda membunuh satu, Anda tidak akan melihat konfirmasi selain dijatuhkan kembali ke prompt shell. Ketika Anda menangguhkan suatu proses, Anda dapat melakukan hal-hal mewah dengannya. Misalnya, jalankan ini:

fg

Dengan program ditangguhkan akan membawanya kembali ke latar depan.

Dan menjalankan perintah

bg

Dengan program ditangguhkan akan memungkinkannya untuk berjalan di latar belakang (output program masih akan pergi ke TTY).

Jika Anda ingin mematikan program yang ditangguhkan, Anda tidak harus mengembalikannya fgterlebih dahulu, Anda cukup melakukan perintah:

kill %1

Jika Anda memiliki beberapa perintah yang ditangguhkan, jalankan

jobs

akan mencantumkannya, seperti ini:

[1]-  Stopped                 pianobar
[2]+  Stopped                 yes

Menggunakan %#, di mana #adalah jumlah pekerjaan (yang dalam kurung persegi dari jobsoutput) dengan bg, fgatau kill, dapat digunakan untuk melakukan tindakan pada pekerjaan itu.

Wuffers
sumber
3
Anda dapat mengubah tombol mana yang melakukan pekerjaan itu dengan menggunakan sttyperintah. Misalnya stty susp ^Z atau stty intr ^C.
RedGrittyBrick
7
Sebenarnya, ia mengirimkan SIGTSTP, yang dapat dicegat.
Simon Richter
2
Keren! Jadi, jika sebuah program menolak untuk mati dengan Ctrl + C, bagaimana Anda memaksa membunuhnya?
Aditya MP
2
@adityamenon Temukan nama yang dapat dieksekusi, misalnya amarokdan jalankan killall amarok, atau jalankan ps auxdan temukan id proses di sebelah nama yang dapat dieksekusi dan jalankan kill {process id}.
Bruno Finger
22

Ctrl + Z menunda proses dengan SIGTSTP, Anda dapat melanjutkannya nanti. Ctrl + C membunuh proses dengan SIGINT, yang menghentikan proses kecuali jika ditangani / diabaikan oleh target, sehingga Anda tidak dapat melanjutkannya. Ada juga SIGSTOP yang dapat dikirim oleh kill()dan yang prosesnya tidak dapat mencegat. SIGCONT adalah mitra untuk SIGSTOP dan SIGTSTP yang membatalkan proses.

Ben Voigt
sumber
Tidak, itu SIGTSTP, bukan SIGSTOP dan dapat dicegat.
sch
@sch, apakah itu benar sekarang?
Ben Voigt
Ya, meskipun Ctrl-Z (dan CTRL-C) menyebabkan grup proses (grup proses foreground terminal) menerima sinyal itu, tidak harus hanya satu proses. Perhatikan juga SIGTTIN dan SIGTTOU dikirim ke proses yang tidak berada dalam kelompok proses latar depan terminal ketika kemudian mencoba membaca atau menulis dari / ke terminal, yang juga menangguhkan mereka.
sch
@sch: Bukankah proses vs grup hanya perbedaan dalam bagaimana sinyal dikirim? IIRC kill()memungkinkan Anda mengirim SIGSTOPke grup dengan baik.
Ben Voigt
Ya, perintah saya adalah tentang CTRL-Z Anda menangguhkan proses ... yang dapat menyesatkan orang sehingga menganggapnya dikirim ke satu proses padahal sebenarnya itu adalah pekerjaan atau grup proses .
sch
17

CTRL + Z menghentikan (menjeda) pekerjaan

CTRL + C mengakhiri pekerjaan

dengan CTRL + C Anda tidak dapat melanjutkan proses tetapi dengan CTRL + Z pekerjaan dapat dilanjutkan dengan hanya memasukkan pada perintah promt:

fg %1

jika Anda memiliki beberapa proses yang dijeda maka Anda harus melakukannya

jobs

untuk melihat output dan memilih nomor yang sesuai untuk melanjutkan mis

fg %3

melanjutkan pekerjaan ketiga dalam daftar. Anda juga dapat menjalankan pekerjaan di latar belakang

bg %n

di mana n adalah nomor pekerjaan.

g24l
sumber
Itu pekerjaan (kelompok proses), bukan proses yang berurusan dengan CTRL-C, CTRL-Z, fg dan bg.
sch
3
Cntrl + Z pause the currently running process. 

Dan

Cntrl + C simply terminates the running process.

Menggunakan Cntrl + C Anda tidak dapat melanjutkan proses. dimana dengan menggunakan Cntrl + Z Anda dapat melanjutkan proses.

gunakan fg% 1 untuk melanjutkan proses.

Ravindra Miyani
sumber
3

CTRL+ Zberhenti (menjeda) pekerjaan

CTRL+ Cmengakhiri pekerjaan

Dengan CTRL+ CAnda tidak dapat melanjutkan proses, tetapi dengan CTRL+ Zpekerjaan dapat dilanjutkan dengan hanya memasukkan pada prompt perintah:

fg% 1

Jika Anda memiliki beberapa proses yang dijeda maka Anda harus melakukannya

pekerjaan

untuk melihat hasilnya.

abul
sumber
2

Jawaban sebelumnya benar, tetapi untuk beberapa alasan yang tidak diketahui Ctrl-Z menunda semua proses anak juga, tetapi killall -SIGSTOP ... hanya menunda proses paling depan (induk) dan membiarkan anak-anak berjalan seperti yang mereka inginkan.

Kostas
sumber