ctrl c vs ctrl z dengan pekerjaan latar depan

26

Ctrl+ Zmenghentikan pekerjaan sedangkan Ctrl+ Cmembunuh pekerjaan.

Mengapa demikian? Bukankah sebaliknya lebih masuk akal?

z@z-lap:~$ sleep 100&
[1] 4458
z@z-lap:~$ sleep 200&
[2] 4459
z@z-lap:~$ jobs
[1]-  Running                 sleep 100 &
[2]+  Running                 sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^Z
[1]+  Stopped                 sleep 100
z@z-lap:~$ jobs
[1]+  Stopped                 sleep 100
[2]-  Running                 sleep 200 &
z@z-lap:~$ fg %1
sleep 100
^C
z@z-lap:~$ jobs
[2]+  Running                 sleep 200 &
neo0
sumber
4
"Bukankah sebaliknya lebih masuk akal?" Bisakah Anda menentukan mengapa Anda berpikir demikian?
glglgl

Jawaban:

55

Saya pikir Anda mungkin bingung tentang notasi kontrol pekerjaan. Khususnya "Berhenti" berarti bahwa suatu pekerjaan masih hidup tetapi kemampuannya untuk memproses apa pun telah dipegang (tidak diberikan waktu pada CPU untuk memproses apa pun). Ini secara efektif merupakan kondisi "Jeda" atau "Ditangguhkan", meskipun itu bukan istilah teknis yang benar.

  • CtrlCtidak "menghentikan" pekerjaan, itu membatalkan atau membunuhnya. Secara teknis itu menyebabkan sinyal interupsi untuk dikirim ke program yang memerintahkannya untuk membatalkan apa yang dilakukannya dan segera keluar. Beberapa program akan mendengar sinyal ini dan melakukan pembersihan darurat sendiri sebelum keluar. Orang lain tidak akan menanggapi sinyal dan selanjutnya dibatalkan.

  • CtrlZ, di sisi lain, "menghentikan" pekerjaan. Sekali lagi ini dilakukan dengan sinyal, tetapi kali ini adalah sinyal 'berhenti' bukan sinyal 'interupsi'. Ini secara efektif menahan dan mengembalikan kontrol ke shell, tetapi tidak benar-benar mematikan pekerjaan. Jika Anda ingin pekerjaan seperti itu terus berjalan, Anda kemudian dapat mengeluarkan bgperintah untuk mengirim pekerjaan yang terakhir berhenti ke latar belakang. Ini kemudian akan terus berjalan sebagai pekerjaan latar belakang seolah-olah Anda telah menjalankannya &sejak awal. Anda juga dapat menggunakan fguntuk melanjutkan pekerjaan yang berhenti terakhir di latar depan (memungkinkan untuk melanjutkan di mana ia tinggalkan, dan memungkinkan Anda untuk berinteraksi lagi dengan itu).

Caleb
sumber
Saya masih berpikir bahwa Ctrl + Z akan mengirim SIGKILL dan Ctrl + C mengirimkan SIGINIT. Jadi Ctrl + Z juga akan membunuh pekerjaan itu. Tapi dari contoh saya Ctrl + Z hanya Menghentikan pekerjaan seperti yang Anda katakan. Jadi itu membuat saya sedikit bingung.
neo0
10
@ neo0 - mungkin Anda terbiasa dengan pengaturan khusus yang aneh? Anda dapat mengonfigurasikan hal-hal itu - meskipun Anda seharusnya tidak seandainya memiliki aplikasi yang bergantung pada peta itu. Tetapi konfigurasi default adalah CTRL+C=SIGINTdan CTRL+Z=SIGTSTP.
mikeserv
3
Caleb benar (+1). Ctrl-Z menghentikan program, yang harus Anda anggap sebagai "membekukan" itu, tetapi program itu masih ada dalam memori, file-file itu dibuka, dll. Tidak terbunuh / dihentikan.
Olivier Dulac
"Tangguhkan" mungkin lebih jelas daripada "berhenti".
Russell Borogove
1
@ jiggunjer Itu tentang bentuk benda. Jawaban ini memberikan beberapa latar belakang mengapa dua langkah diperlukan dan yang satu ini memperkenalkan beberapa fungsi untuk membuat langkah-langkah itu lebih tidak menyakitkan.
Caleb