ctrl c so với ctrl z với công việc nền trước


26

Ctrl+ Zdừng công việc trong khi Ctrl+ Cgiết chết công việc.

Tại sao vậy? Không phải cách khác sẽ có ý nghĩa hơn?

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 &

4
"Không phải cách khác sẽ có ý nghĩa hơn?" Bạn có thể chỉ định lý do tại sao bạn nghĩ rằng nó sẽ?
glglgl

Câu trả lời:


55

Tôi nghĩ rằng bạn có thể nhầm lẫn về ký hiệu kiểm soát công việc. Đáng chú ý là "Dừng lại" có nghĩa là một công việc vẫn còn tồn tại nhưng khả năng xử lý mọi thứ đã được giữ (nó không được đưa ra bất kỳ lúc nào trên CPU để xử lý bất cứ điều gì). Đây thực sự là trạng thái "Tạm dừng" hoặc "Bị treo", mặc dù đó không phải là thuật ngữ kỹ thuật chính xác.

  • CtrlCkhông "dừng" một công việc, nó hủy bỏ hoặc giết chết nó. Về mặt kỹ thuật, nó gây ra tín hiệu ngắt được gửi đến chương trình và bảo nó hủy bỏ những gì nó đang làm và thoát ngay lập tức. Một số chương trình sẽ nghe thấy tín hiệu này và thực hiện một số công việc dọn dẹp khẩn cấp trên chính chúng trước khi thoát. Những người khác sẽ không trả lời tín hiệu và sau đó chỉ bị hủy bỏ.

  • CtrlZmặt khác, "dừng" một công việc. Một lần nữa, điều này được thực hiện với tín hiệu, nhưng lần này là tín hiệu 'dừng' thay vì tín hiệu 'ngắt'. Điều này có hiệu quả khiến nó bị giữ và trả lại quyền kiểm soát cho vỏ, nhưng không thực sự giết chết công việc. Nếu bạn muốn một công việc như vậy tiếp tục chạy, thì bạn có thể ra bglệnh để gửi công việc đã dừng cuối cùng xuống nền. Sau đó, nó sẽ tiếp tục chạy như một công việc nền như thể bạn đã chạy nó &ở nơi đầu tiên. Bạn cũng có thể sử dụng fgđể tiếp tục công việc đã dừng cuối cùng ở nền trước (cho phép nó tiếp tục ở nơi nó dừng lại và cho phép bạn tương tác với nó một lần nữa).


Tôi vẫn nghĩ rằng Ctrl + Z sẽ gửi SIGKILL và Ctrl + C gửi SIGINIT. Vì vậy, Ctrl + Z cũng sẽ giết chết công việc. Nhưng từ ví dụ của tôi Ctrl + Z chỉ Dừng công việc như bạn đã nói. Vì vậy, nó làm cho tôi một chút bối rối.
neo0

10
@ neo0 - có thể bạn đã quen với một số thiết lập tùy chỉnh kỳ lạ? Bạn có thể định cấu hình nội dung đó - mặc dù bạn có thể không nên trong trường hợp bạn có ứng dụng dựa trên các bản đồ đó. Nhưng cấu hình mặc định là CTRL+C=SIGINTCTRL+Z=SIGTSTP.
mikeerv

3
Caleb đúng (+1). Ctrl-Z dừng chương trình mà bạn nên coi là "đóng băng" nó, nhưng chương trình đó vẫn còn trong bộ nhớ, đó là các tệp được mở, v.v. Nó không bị giết / chấm dứt.
Olivier Dulac

"Tạm dừng" có thể rõ ràng hơn "dừng".
Russell Borogove

1
@jiggunjer Đó là về hình dạng của sự vật. Câu trả lời này cung cấp một số nền tảng về lý do tại sao hai bước được yêu cầu và bước này giới thiệu một số chức năng để làm cho các bước đó không gây đau đớn hơn.
Caleb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.