Có gì khác nhau giữa Ctrl + Z và Ctrl + C trong dòng lệnh Unix?


188

Tôi đang sử dụng Mac OS X Terminal. Và tôi sử dụng Ctrl+ Zhoặc Ctrl+ Cđể dừng một số chương trình. Nhưng tôi nhận ra rằng tôi không biết chính xác 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à một câu hỏi siêu người dùng trong tuần .
Đọc mục blog ngày 13 tháng 3 năm 2011 để biết thêm chi tiết hoặc gửi Câu hỏi trong tuần của riêng bạn .

Câu trả lời:


250

Control+ Zđược sử dụng để tạm dừng một quá trình bằng cách gửi tín hiệu SIGSTOP, chương trình không thể bị chặn bởi chương trình. Trong khi Control+ 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ự dọn sạch trước khi thoát hoặc không thoát ra.

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

[1]+  Stopped                 yes

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

fg

Với một chương trình bị đình chỉ 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 ở chế độ nền (mặc dù đầu ra của chương trình vẫn sẽ chuyển đến TTY).

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

kill %1

Nếu bạn có nhiều lệnh treo, đang chạy

jobs

sẽ liệt kê chúng, như thế này:

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

Sử dụng %#, nơi #là số công việc (một trong dấu ngoặc vuông từ jobsđầu ra) với bg, fghoặc kill, có thể được sử dụng để thực hiện hành động trên công việc đó.


3
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 sttylệnh. Ví dụ stty susp ^Z hay stty intr ^C.
RedGrittyBrick

7
Trên thực tế, nó gửi SIGTSTP, có thể bị chặn.
Simon Richter

2
Mát mẻ! 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 phải giết nó?
MP Aditya

2
@adityamenon Tìm tên thực thi, ví dụ amarokvà chạy killall amarok, hoặc chạy ps auxvà tìm id tiến trình bên cạnh tên thực thi và chạy kill {process id}.
Bruno Finger

22

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 quá trình bằng SIGINT, kết thúc quá trình trừ khi nó được xử lý / bỏ qua bởi mục tiêu, vì vậy bạn không thể tiếp tục quá trình. Ngoài ra còn có một SIGSTOP có thể được gửi bởi kill()và quá trình không thể chặn. SIGCONT là đối tác của cả SIGSTOP và SIGTSTP mà không đình chỉ quá trình.


Không, đó là SIGTSTP, không phải SIGSTOP và nó có thể bị chặn.
sch

@sch, bây giờ có đúng không?
Ben Voigt

Có, mặc dù Ctrl-Z (và CTRL-C) khiến một nhóm quy trình (nhóm quy trình tiền cảnh của thiết bị đầu cuối) nhận được tín hiệu đó, không nhất thiết chỉ là một quy trình. Cũng lưu ý SIGTTIN và SIGTTOU được gửi đến các quy trình không nằm trong nhóm quy trình tiền cảnh của thiết bị đầu cuối khi sau đó cố gắng đọc hoặc ghi từ / đến nó, điều đó cũng đình chỉ chúng.
sch

@sch: Không phải quá trình so với nhóm chỉ là sự khác biệt trong cách gửi tín hiệu sao? IIRC kill()cho phép bạn gửi SIGSTOPđến một nhóm tốt.
Ben Voigt

Có, lệnh của tôi là về CTRL-Z của bạn đình chỉ quá trình ... điều này có thể khiến mọi người hiểu lầm rằng nó được gửi đến chỉ một quy trình khi đó thực sự là một nhóm công việc hoặc quy trình .
sch

17

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 quá trình 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, vd

fg %3

nối lại công việc thứ ba trong danh sách. Bạn cũng có thể có các công việc đang chạy trong nền với

bg %n

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


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

3
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

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

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

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

fg% 1

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

việc làm

để xem đầu ra.


2

Các câu trả lời trước là đúng, nhưng vì một số lý do không rõ, Ctrl-Z cũng tạm dừng tất cả các quy trình con, nhưng killall -SIGSTOP ... chỉ tạm dừng quá trình (phụ huynh) trước và để trẻ chạy theo ý muốn.

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.