Tại sao một số chương trình trở lại shell ngay lập tức trong khi những chương trình khác không cho đến khi thực hiện xong?


13

Tôi đã đọc từ cuốn sách Hệ điều hành hiện đại rằng khi một lệnh được chạy, shell sẽ tạo ra một tiến trình con, đợi cho đến khi đứa trẻ thực hiện xong và sau đó chờ lệnh khác từ người dùng. Đây thực sự là trường hợp cho nhiều chương trình như thế gedit. Thiết bị đầu cuối không nhận lệnh cho đến khi tôi đóng gedit. Tuy nhiên, khi tôi mở trình soạn thảo mã nguyên tử , trình bao trả về ngay lập tức, sẵn sàng chấp nhận lệnh tiếp theo ngay cả khi trình soạn thảo đang chạy. Đóng thiết bị đầu cuối không đóng nguyên tử. Điều này có nghĩa là trình soạn thảo đã mở không phải là một tiến trình con? Các cơ chế cơ bản làm cho điều này có thể là gì?

Chạy ps au | grep atomcho

<username>      8042  0.0  0.0  15944  2264 pts/1    S+   00:55   0:00 grep --color=auto atom

1
Sau khi bắt đầu trình soạn thảo nguyên tử, bạn có thể chạy ps au | grep atomtrong thiết bị đầu cuối và thêm đầu ra cho câu hỏi của bạn không?
kirill-a

@ kirill-a Tôi đã cập nhật câu hỏi.
Aswin PJ

Câu trả lời:


18

Câu hỏi hỏi về hai loại chương trình:

  1. các chương trình tương tác với người dùng trong trình bao và
  2. các chương trình không tương tác với người dùng trong trình bao.

Trong trường hợp đầu tiên, các chương trình tương tác với người dùng trong trình bao được thiết kế để chạy đến khi hoàn thành trước khi trả lại quyền điều khiển cho trình bao. Không có gì đặc biệt được thực hiện.

Trường hợp thứ hai phức tạp hơn. Thông thường, chương trình sẽ rẽ nhánh (tạo một bản sao của chính nó trong bộ nhớ) và sắp xếp để loại bỏ liên kết của nó với thiết bị đầu cuối điều khiển của shell và có thể thực thi một chương trình khác - chạy độc lập với shell gốc. Bạn có thể thấy các tin nhắn từ chương trình thứ hai, nhưng nó thường không tương tác với bạn. Tùy thuộc vào cách nó được sử dụng, bạn có thể có

  • một tiến trình (máy chủ) daemon , hoặc
  • chương trình có thể chạy trong một cửa sổ mới. Biên tập đồ họa làm sau.

Đọc thêm:


Phần về việc tách và tách liên kết khỏi thiết bị đầu cuối thường được thực hiện bằng cách gọi daemonhàm thư viện thực hiện tất cả điều này.
kasperd

Để tránh nhận thiết bị đầu cuối điều khiển, sử dụng nĩa đôi
jfs

Đối với cả hai nhận xét: chức năng này không có trong POSIX và tôi biết về việc kiểm soát các thiết bị đầu cuối, nhưng vẫn giữ câu trả lời ngắn gọn và đơn giản. Tôi đã sử dụng nĩa đôi từ cuối những năm 1980.
Thomas Dickey
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.