Sự khác biệt giữa Ctrl-z và Ctrl-c trong thiết bị đầu cuối là gì?


120

Bất cứ ai có thể cho tôi biết sự khác biệt giữa ctrl+ zctrl+ c?

Khi tôi ở trong thiết bị đầu cuối, cả hai kết hợp đều dừng quá trình hiện tại, nhưng chính xác thì sự khác biệt giữa cả hai là gì?


Tôi đã hỏi một câu hỏi tương tự ở đây: unix.stackexchange.com/questions/116959/iêu
ThorSummoner


vâng tôi đã thành công trong việc hiểu sự khác biệt giữa cả hai !!
chaitanya lakkundi

Một điều tôi muốn thêm ở đây, đó là hầu hết các chàng trai (trong vòng tròn chuyên nghiệp của tôi cũng vậy) không phân biệt giữa họ. Và sử dụng tùy chọn CTRL-Z để chấm dứt lệnh. Đó là thực hành sai. Bạn phải sử dụng CTRL-C trong tất cả các trường hợp này. Vì CTRL-Z chỉ cần đặt trong nền. Vì vậy, quá trình không chấm dứt cho đến khi hoàn thành, đó có thể không phải là mong muốn của Người dùng (hầu hết thời gian) khi anh ta nhấn CTRL-Z để chấm dứt.
kuldeep.kamboj

Câu trả lời:


156

Nếu chúng ta để các trường hợp cạnh sang một bên, sự khác biệt là đơn giản. Control+ Chủy bỏ ứng dụng gần như ngay lập tức trong khi Control+ chuyển Znó vào nền, bị treo.

Shell gửi các tín hiệu khác nhau đến các ứng dụng cơ bản trên các kết hợp này:

  • Control+ C(ký tự điều khiển intr) gửi SIGINT sẽ làm gián đoạn ứng dụng. Thông thường khiến nó hủy bỏ, nhưng điều này tùy thuộc vào ứng dụng để quyết định.

  • Control+ Z(ký tự điều khiển susp) gửi SIGTSTP đến một ứng dụng nền trước, có hiệu quả đặt nó ở chế độ nền, bị treo. Điều này rất hữu ích nếu bạn cần thoát ra khỏi một thứ như trình soạn thảo để lấy và lấy một số dữ liệu bạn cần. Bạn có thể quay trở lại vào ứng dụng bằng cách chạy fg(hoặc %xnơi xlà số công việc như trong jobs).

    Chúng ta có thể kiểm tra điều này bằng cách chạy nano TEST, sau đó nhấn Control+ Zvà sau đó chạy ps aux | grep TEST. Điều này sẽ cho chúng ta thấy nanoquá trình vẫn đang chạy:

    oli     3278  0.0  0.0  14492  3160 pts/4    T    13:59   0:00 nano TEST
    

    Hơn nữa, chúng ta có thể thấy (từ T, trong cột trạng thái) rằng quá trình đã bị dừng lại . Vì vậy, nó vẫn còn sống, nhưng nó không chạy ... Nó có thể được nối lại.

    Một số ứng dụng sẽ sập nếu chúng có các quy trình bên ngoài đang diễn ra (như yêu cầu web) có thể hết thời gian trong khi chúng đang ngủ.


51
Đáng nói thêm là cũng có thể chạy bg(thay vì fg) để bỏ tạm dừng một ứng dụng đã được Ctrl + Z'ed mà không đưa nó trở lại nền trước; cung cấp cho bạn quyền kiểm soát cả shell đã khởi động ứng dụng chính ứng dụng, như thể bạn đã sử dụng &khi khởi động ứng dụng. Điều này thường có ích khi bạn quên bắt đầu với &:)
Malte Skoruppa

6
Và bạn có thể quay lại quá trình đó bằng cách gõ fglại!
sleblanc

4
Trong trường hợp có một số công việc bị treo hoặc trong nền: "công việc" liệt kê chúng và "fg% n" hoặc "bg% n" hoặc thậm chí "kill% n" để đặt công việc% n vào nền trước, nền hoặc giết nó .
Olivier Dulac

3
@Oli: Đoạn thứ hai của bạn nói rằng, Shell Vỏ gửi tín hiệu [s] cho các ứng dụng cơ bản. Khác. Không, trình điều khiển hệ điều hành / thiết bị đầu cuối gửi tín hiệu. (Trong hệ thống cửa sổ, trình quản lý cửa sổ có thể đóng vai trò.) Ngoài ra, để hoàn thành (mặc dù vượt quá phạm vi của câu hỏi ban đầu), bạn có thể muốn đề cập đến Ctrl + \.
Scott

Làm thế nào để phiên biết nhóm quy trình nào phải quay lại tiền cảnh sau khi thực hiện một trong hai ctrl choặc ctrl z? Nó mặc định là SID (bash)?
jiggunjer

16

Control+ Zđình chỉ một tiến trình ( SIGTSTP) và Control+ Clàm gián đoạn một tiến trình ( SIGINT)

http://en.wikipedia.org/wiki/Control-Z

Trên các hệ thống tương tự Unix, Control + Z là ánh xạ bàn phím mặc định phổ biến nhất cho chuỗi khóa tạm dừng một quá trình

http://en.wikipedia.org/wiki/Control-C

Trong các hệ thống POSIX, chuỗi này khiến chương trình đang hoạt động nhận tín hiệu SIGINT. Nếu chương trình không chỉ định cách xử lý tình trạng này, nó sẽ bị chấm dứt. Thông thường, một chương trình xử lý SIGINT vẫn sẽ tự chấm dứt hoặc ít nhất là chấm dứt tác vụ đang chạy bên trong nó


1
Tốt công việc đăng tài liệu tham khảo. Nhưng nói chung, Wikipedia không phải là một nguồn rất tốt để tham khảo kỹ thuật.
Aaron

3
@ BryceAtNetwork23 điều đó rất đúng; Tôi cảm thấy trong trường hợp này định nghĩa Wikipedia là đủ. Tôi sẽ tìm kiếm các tài liệu tham khảo kỹ thuật hơn trong tương lai!
Bóng đèn bị mất ngủ

14

Ctrl+ Cđược sử dụng để giết một quá trình với tín hiệu SIGINT, nói cách khác, nó là một lệnh giết lịch sự .

Ctrl+ Z được sử dụng để tạm dừng một quá trình bằng cách gửi tín hiệu SIGTSTPđó, giống như tín hiệu ngủ, có thể được hoàn tác và quá trình có thể được nối lại.

Tuy nhiên, khi một quá trình bị đình chỉ, chúng ta có thể tiếp tục lại nó bằng cách fg(tiếp tục ở nền trước) và bg(tiếp tục ở chế độ nền), nhưng tôi không thể tiếp tục quá trình bị giết, đó là một sự khác biệt giữa việc sử dụng Ctrl+ C& Ctrl+ Z.

Làm thế nào chúng ta có thể xem các quy trình bị đình chỉ?

Các jobslệnh cho đầu ra như thế này:

[1]-  Stopped                 cat
[2]+  Stopped                 vi

Làm thế nào để giết một quá trình bị đình chỉ trong nền?

Bằng cách sử dụng killlệnh:

kill %ntrong đó nsố được hiển thị bởi jobslệnh. Vì vậy, nếu tôi muốn giết mèo : kill %1.


1
theo các bình luận khác trong chủ đề này, hiệu chỉnh: ctrl-z gửi tín hiệu SIGTSTP chứ không phải SIGSTOP.
lukewendling

Kill% 1 cho tôi biết - Hoạt động không được phép. Tại sao vậy? Cảm ơn
Satya Prakash

7

Nói một cách đơn giản:

  • CTRL-C yêu cầu chương trình hủy bỏ .

  • CTRL-Z buộc chương trình tạm dừng và đi vào nền .

    Điều này cho phép bạn tiếp tục nó sau với lệnh fg. Các tác vụ nền còn lại sẽ bị hủy khi bạn thoát khỏi vỏ đăng nhập.


5

Điều này sẽ giúp

Ctrl+ 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 Ctrl+ Cđược sử dụng để tiêu diệt một quá trình với tín hiệu SIGINT và có thể bị chương trình chặn lại để nó có thể tự dọn sạch trước khi thoát hoặc không thoát ra.


4
Đây không phải là hoàn toàn chính xác. Nó gửi SIGTSTP, có thể được bắt bởi chương trình. Có bốn tín hiệu khác nhau, có thể đình chỉ một chương trình SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU. Trong số đó chỉ SIGSTOPkhông thể bị chặn. Ba cái còn lại được sử dụng bởi thiết bị đầu cuối để dừng quá trình trong các điều kiện khác nhau.
kasperd

4

khi bạn nhấn ctrl+ c, điều đó có nghĩa là bạn gửi SIGINT cho quy trình của mình. giống như bạn gõ lệnh này : kill -SIGINT <your_pid>. Nó sẽ giết bạn quá trình của bạn. Đó là lý do tại sao bạn không thể nhìn thấy nó khi ban hành lệnh ps .
Khi bạn nhấn ctrl+ z, điều đó có nghĩa là bạn gửi SIGSTOP cho quy trình của mình. giống như bạn gõ lệnh này : kill -SIGKSTOP <your_pid>. Nó sẽ dừng quá trình của bạn, nhưng quá trình vẫn còn sống. Vì vậy, bạn có thể kích hoạt lại quy trình của mình bằng cách gửi SIGCONT đến quy trình của bạ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.