Câu hỏi Điểm khác biệt giữa Ctrl + Z và Ctrl + C trong dòng lệnh Unix là gì?


Tôi đang sử dụng Mac OS X Terminal. Và tôi sử dụng Ctrl+Z hoặc là Ctrl+C để ngăn chặn một số chương trình. Nhưng tôi nhận ra rằng tôi không biết họ đang làm gì. Chúng là gì và sự khác biệt giữa chúng là gì?

Câu hỏi này là Câu hỏi của người dùng trong tuần.
  Đọc ngày 13 tháng 3 năm 2011 mục blog để biết thêm chi tiết hoặc gửi của riêng bạn Câu hỏi của Tuần.


177
2018-03-27 00:39


gốc




Các câu trả lời:


Điều khiển+Z được sử dụng để tạm dừng quá trình bằng cách gửi tín hiệu SIGSTOPkhông thể bị chặn bởi chương trình. Trong khi Điều khiển+C được sử dụng để giết một quá trình với tín hiệu SIGINTvà có thể bị chặn bởi một chương trình để nó có thể tự làm sạch trước khi thoát hoặc không thoát ra ngoài.

Nếu bạn tạm dừng một quá trình, quá trình này sẽ hiển thị trong trình bao để cho bạn biết rằng nó đã bị tạm ngưng:

[1]+  Stopped                 yes

Tuy nhiên, nếu bạn giết một, bạn sẽ không thấy bất kỳ xác nhận nào khác ngoài việc bị trả về dấu nhắc trình bao. Khi bạn đình chỉ một quá trình, bạn cũng có thể làm những điều kỳ lạ với nó. Ví dụ, chạy này:

fg

Với một chương trình bị treo sẽ đưa nó trở lại nền trước.

Và chạy lệnh

bg

Với một chương trình bị treo sẽ cho phép nó chạy trong nền (đầu ra của chương trình vẫn sẽ đi đến TTY, mặc dù).

Nếu bạn muốn giết một chương trình bị đình chỉ, bạn không phải mang nó trở lại fg đầu tiên, bạn chỉ cần thực hiện lệnh:

kill %1

Nếu bạn có nhiều lệnh bị treo, hãy chạy

jobs

sẽ liệt kê chúng, như sau:

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

Sử dụng %#, Ở đâu # là số công việc (số trong ngoặc vuông từ jobs đầu ra) với bg, fg, hoặc là kill, có thể được sử dụng để thực hiện tác vụ trên công việc đó.


234
2018-03-27 01:15



Bạn có thể thay đổi phím nào thực hiện công việc nào bằng cách sử dụng stty chỉ huy. Ví dụ stty susp ^Z  hoặc là stty intr ^C. - RedGrittyBrick
Trên thực tế, nó sẽ gửi SIGTSTP, có thể bị chặn. - Simon Richter
Mát mẻ! Vì vậy, nếu một chương trình từ chối chết với Ctrl + C làm thế nào để bạn buộc giết nó? - Aditya M P
@adityamenon Tìm tên thực thi, ví dụ amarok và chạy killall amarok, hoặc chạy ps aux và tìm id tiến trình bên cạnh tên thực thi và chạy kill {process id}. - Bruno Finger


Ctrl + Z tạm dừng quá trình với SIGTSTP, bạn có thể tiếp tục lại sau. Ctrl + C giết chết quá trình bằng SIGINT, kết thúc quá trình này trừ khi nó được xử lý / bỏ qua bởi đích, vì vậy bạn không thể tiếp tục nó. Ngoài ra còn có một SIGSTOP có thể được gửi bởi kill() và quá trình này không thể chặn được. SIGCONT là đối tác của cả SIGSTOP và SIGTSTP để hủy bỏ quá trình này.


22
2018-03-27 00:43



Không, đó là SIGTSTP, không phải SIGSTOP và nó có thể bị chặn. - sch
@sch, có đúng không? - Ben Voigt
Có, mặc dù Ctrl-Z (và CTRL-C) gây ra một quá trình nhóm (nhóm tiến trình tiền cảnh của thiết bị đầu cuối) để nhận tín hiệu đó, không nhất thiết chỉ là một quá trình. Cũng lưu ý SIGTTIN và SIGTTOU được gửi đến các tiến trình không có trong nhóm tiến trình nền trước của thiết bị đầu cuối khi cố gắng đọc hoặc ghi từ / đến nó, điều đó cũng tạm ngưng chúng. - sch
@sch: Không phải là quá trình so với nhóm chỉ có một sự khác biệt trong cách tín hiệu được gửi đi? IIRC kill() cho phép bạn gửi SIGSTOP cho một nhóm tốt. - Ben Voigt
Vâng, lệnh của tôi là về CTRL-Z tạm ngừng quá trình ... có thể đánh lừa mọi người nghĩ rằng nó được gửi đến chỉ một quá trình khi nó thực sự là việc làm hoặc là nhóm tiến trình. - sch


CTRL + Z dừng (tạm dừng) một công việc

CTRL + C chấm dứt công việc

với CTRL + C bạn không thể tiếp tục quá trình nhưng với CTRL + Z, công việc có thể được tiếp tục bằng cách chỉ cần nhập vào lệnh promt:

fg %1

nếu bạn có nhiều quy trình bị tạm dừng thì bạn nên làm

jobs

để xem đầu ra và chọn số thích hợp để tiếp tục, ví dụ:

fg %3

tiếp tục công việc thứ ba trong danh sách. Bạn cũng có thể có công việc đang chạy trong nền với

bg %n

trong đó n là số công việc.


17
2018-03-27 11:52



Đó là các công việc (các nhóm quy trình), không phải các quy trình mà CTRL-C, CTRL-Z, fg và bg đối phó với. - sch


Cntrl + Z pause the currently running process. 

Cntrl + C simply terminates the running process.

Sử dụng Cntrl + C bạn không thể tiếp tục quá trình. khi sử dụng Cntrl + Z, bạn có thể tiếp tục quá trình.

sử dụng fg% 1 để tiếp tục quá trình.


3
2018-03-13 06:48





CTRL+Z dừng lại (tạm dừng) một công việc

CTRL+Cchấm dứt công việc

Với CTRL+C bạn không thể tiếp tục quá trình, nhưng với CTRL+Z công việc có thể được tiếp tục bằng cách chỉ cần nhập vào dấu nhắc lệnh:

fg% 1

Nếu bạn có nhiều quy trình bị tạm dừng thì bạn nên làm

công việc

để xem đầu ra.


3
2017-07-03 15:57





Các câu trả lời trước là chính xác, nhưng vì một số lý do không xác định, Ctrl-Z cũng đình chỉ tất cả các tiến trình con, nhưng killall -SIGSTOP ... chỉ đình chỉ quá trình gốc (cha) và để các con chạy theo ý muốn.


2
2018-02-26 17:19