Việc nhấn ctrl-c nhiều lần có khiến chương trình đang chạy nhanh hơn không?


41

Tôi thường bắt đầu đọc một tập tin lớn và sau đó muốn thoát ra sau một thời gian, nhưng có một độ trễ từ việc nhấn
Ctrl+ Cđể dừng chương trình. Có cơ hội rút ngắn độ trễ bằng cách nhấn phím Ctrl+ Cnhiều lần không? Hay tôi đang lãng phí bàn phím của mình?


Tôi đã nhận thấy khi chạy một quy trình gọi các quy trình con khác nhau, Ctrl-C đôi khi sẽ làm gián đoạn đứa trẻ đang chạy, nhưng không làm gián đoạn quá trình cha. Đó là sự thật bash, nhưng không phải trong trường hợp zshluôn đóng cửa cha mẹ. Đó là một trong những lý do tôi thích zsh.
joeytwiddle

17
Có, giống như nhấn nút thang máy hoặc nút đi bộ nhiều lần sẽ khiến thang máy đến sớm hơn hoặc đèn chuyển sang màu xanh nhanh hơn.
Michael

3
Có, giống như các nút thang máy và lối băng qua đường, CTRL-C cũng có thể bị dính hoặc rỉ sét hoặc phát triển các kết nối iffy. Nhấn nhiều lần hơn là một chiến thuật tốt vì chỉ có một lần nhấn phải đăng ký thang máy để đến, dấu hiệu đi bộ để sáng lên hoặc chương trình đóng.
hà mã

1
@hippietrail nhưng vỏ của bạn sẽ in ra ^Ckhi đăng ký báo chí (ít nhất là bash không)
wchargein

1
Đối với những gì nó có giá trị, tôi không cho rằng nó lãng phí các phím bấm của mình - tôi coi nó làm giảm bớt sự thất vọng theo cách không gây hại. (Tôi thường đánh nó 2-3 lần, nhưng đó là một phần vì tôi "lớn lên trên" thiết bị đầu cuối gắn trên đường dây điện thoại mà bạn có thể không phải lúc nào đếm trên tất cả các phím tắt duy nhất đạt máy.)
keshlam

Câu trả lời:


35

Sau lần đầu tiên Ctrl-C, chương trình sẽ nhận SIGINTvà thường bắt đầu dọn dẹp (xóa các tệp tmp, đóng ổ cắm, v.v.). Nếu bạn nhấn Ctrl-Clại trong khi điều đó đang diễn ra, có thể bạn sẽ làm gián đoạn thói quen dọn dẹp (tức là tín hiệu bổ sung có thể được thực hiện thay vì bị bỏ lại một mình), để lại một mớ hỗn độn. Mặc dù điều này thường không xảy ra, nhưng thông thường, các tín hiệu bổ sung trên thực tế được gửi sauquá trình kết thúc (vì sự chậm trễ vốn có trong sự tương tác của người vận hành với hệ thống). Điều đó có nghĩa là tín hiệu được nhận bởi một quá trình khác (thường là vỏ, nhưng không phải luôn luôn). Nếu người nhận đó không xử lý tín hiệu này đúng cách (như shell thường làm - hãy xem câu trả lời của Jenny D), bạn có thể ngạc nhiên một cách khó chịu trước kết quả của một hành động như vậy.


Tại sao nó nên làm gián đoạn thói quen dọn dẹp? Đó chỉ là một tín hiệu khác INTmà quá trình nhận được.
hỗn loạn

4
@chaos Tại sao nên? Nó nên nếu thói quen dọn dẹp đã bị treo lên và bạn muốn ngăn chặn nó. Nó thực sự hoạt động theo cách này? Vâng, khá thường xuyên. Bạn có thể chứng minh điều đó đủ đơn giản: tạo một tập lệnh bash với một dòng duy nhất trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10. Chạy tập lệnh và nhấn ctrl-C hai lần. Bạn sẽ thấy rằng ctrl-C thứ hai được chuyển đến thói quen "dọn sạch" (trong câu lệnh bẫy) và chấm dứt sleeplệnh của nó .
John1024

1
@ John1024 Ah, bây giờ tôi thấy nó. Cảm ơn đoạn mã script ^^ Nhưng, việc dọn dẹp không bị hủy xem: trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10Đó chỉ là các sleeplệnh nhận được tín hiệu. Cả hai chúng tôi đều sai xD
hỗn loạn

2
Điều đó không chính xác. Truyền tín hiệu là đồng bộ. Nếu isigđược bật, ngay sau khi nhân và nhấn CTRL-C (đối với trình giả lập thiết bị đầu cuối, ngay khi trình giả lập thiết bị đầu cuối ghi nó vào phía chính của thiết bị đầu cuối giả), tín hiệu SIGINT được gửi đến tất cả các quy trình trong nhóm quy trình tiền cảnh của thiết bị đầu cuối. Nó có thể bị chặn ở đó, nhưng nó sẽ không được chuyển đến quy trình khác. Ngay cả khi bộ đệm thiết bị đầu cuối đã đầy (các ứng dụng không đọc bất kỳ thứ gì bạn đã nhập), CTRL-C sẽ nhảy hàng đợi.
Stéphane Chazelas

1
Có, như một ví dụ, VLC diễn giải nhiều tín hiệu Ctrl + C như một cách để thoát khỏi ô uế, trong khi một Ctrl + C duy nhất sẽ cố gắng thoát sạch.
Jeremy Visser

11

Bạn đang lãng phí chúng. Tất cả những gì xảy ra là một khi máy chủ kết thúc với đầu ra màn hình, nó sẽ nhận được nhiều Ctrl-C. Cái đầu tiên sẽ được sử dụng để giết tiến trình, và những cái sau sẽ kết thúc trong vỏ của bạn, sau đó sẽ trông giống như

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 

6
Quá trình không nhất thiết phải thoát khi gửi SIGINT. Nó có thể tồn tại vô thời hạn và làm một cái gì đó khác nhau mỗi lần nhấn Ctrl + C.
Brian Gordon

Thật. Tôi đã đưa ra các giả định về cách người dùng đang đọc tệp.
Jenny D

5

Câu trả lời ngắn : Nếu quá trình phản ứng với nó.

Câu trả lời dài : Khi bạn nhấn ctrl+ ckernel sẽ gửi tín hiệu đến tiến trình. Tín hiệu nào có thể được xác định bằng lệnh sau:

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

Xem trang người đàn ông của stty:

   intr CHAR
          CHAR will send an interrupt signal

Đó là tín hiệu INT, còn được gọi là số 2. Khi quy trình có bộ xử lý tín hiệu, nó có thể phản ứng với điều này. Hầu hết các quy trình làm một số công việc dọn dẹp để kết thúc thành công.


Ctrl-Z thường gửi SIGTSTP có thể được xử lý (không giống như SIGSTOP).
peterph

4
Không, nó không phải là vỏ gửi SIGINT cho quá trình. Đó là kernel(kỷ luật dòng của thiết bị đầu cuối, trình điều khiển thiết bị đầu cuối) gửi SIGINT đến mọi quy trình trong nhóm quy trình tiền cảnh của thiết bị đầu cuối.
Stéphane Chazelas

Độc giả tương lai, cũng xem unix.stackexchange.com/a/120071/135943 .
tự đại diện

4

Bạn đúng. Các phím bấm đang bị lãng phí. Khi bạn nhấn Crtl+Cvà nó được phát hiện, có những tài nguyên cần phải được xóa, đó là lý do tại sao nó cần có thời gian. Một trường hợp có thể tôi biết Ctrl+Clà cần phải nhấn ở đâu , khi bạn muốn hủy quá trình cập nhật Yum, trong đó Yum yêu cầu bạn nhấn Ctrl+Chai lần để xác nhận rằng bạn thực sự muốn hủy.


2

Mặc dù chỉ có một Ctrl-Clà cần thiết trong trường hợp chung, có một số tình huống có thể cần thiết. Python, chẳng hạn, bẫy Ctrl-Ckhi một luồng mới đang được sinh ra, và vì vậy nếu có sự cố xảy ra giữa lúc bắt đầu nhiều luồng, cần phải gửi lại nhiều lần để nó có thể đi qua pythontiến trình cha mà không bị xử lý bắt.


1
Điều này xảy ra với tôi bây giờ và sau đó khi tôi tạo các kịch bản python đa luồng / được xử lý. Đôi khi một số máy ép là cần thiết trước khi quá trình chính bị giết.
Leo

0

Tôi luôn phải bấm Ctrlcnhiều lần. Tôi chưa bao giờ có phản hồi trên báo chí đầu tiên và phải sử dụng nó nhiều lần cho đến khi hệ thống thực sự nhận ra rằng có một tin nhắn Ctrlcđược gửi đi. Có vẻ như nó thực sự bỏ lỡ / mất hầu hết trong số họ.

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.