2011-07-01 14 views
51

Quá trình Unix có id phiên và là một phần của nhóm quy trình - có thể thay đổi/truy vấn bằng các hàm như setsid()/getpgrp().Sử dụng và ý nghĩa của nhóm phiên và quá trình trong Unix?

Tuy nhiên khái niệm về nhóm xử lý và phiên làm việc luôn lảng tránh tôi, ai có thể giải thích ý nghĩa của các nhóm và nhóm xử lý riêng biệt - tại sao/khi nào muốn tạo phiên mới hoặc đặt một số quy trình trong cùng một phiên và/hoặc nhóm quá trình?

Trả lời

67

Một nhóm quá trình là một tập hợp các quy trình liên quan có thể được báo hiệu cùng một lúc.

Một phiên là một bộ sưu tập của các nhóm quy trình, đó là một trong hai gắn liền với một thiết bị đầu cuối duy nhất (gọi là kiểm soát thiết bị đầu cuối) hoặc không kèm theo bất kỳ thiết bị đầu cuối.

Phiên được sử dụng để kiểm soát công việc: một trong các nhóm quá trình trong phiên là nhóm tiến trình nền trước và có thể được gửi tín hiệu bằng ký tự điều khiển đầu cuối. Bạn có thể nghĩ về một phiên với một thiết bị đầu cuối điều khiển tương ứng với một "đăng nhập" trên thiết bị đầu cuối đó. (Daemons thường tách liên kết khỏi bất kỳ thiết bị đầu cuối kiểm soát nào bằng cách tạo phiên mới mà không có một phiên.)

ví dụ: nếu bạn chạy some_app từ trình bao, hệ vỏ sẽ tạo một nhóm quy trình mới cho nó và làm cho nhóm tiến trình tiền cảnh của phiên. (some_app có thể tạo một số tiến trình con, theo mặc định chúng sẽ là một phần của cùng một nhóm tiến trình.) Nếu bạn nhấn ^Z, nhóm quy trình của some_app sẽ được báo hiệu để dừng nó; và nhóm quá trình của trình bao được chuyển thành nhóm tiến trình tiền cảnh một lần nữa. Sau đó, ví dụ:bg %1 sẽ bắt đầu lại nhóm quy trình của some_app, nhưng hãy giữ nó ở chế độ nền.


Các POSIX.1-2008 standard là khá dễ đọc (ít nhất, tôi nghĩ như vậy!) - hãy xem các definitions và các bộ phận liên quan của chương "General Terminal Interface".

+1

Đó là giải thích rất tốt với thông tin bổ sung có thể xuất hiện dưới dạng câu hỏi sau –

+0

@MatthewSlattery là 'terminal' và' terminal device' được đề cập trong tài liệu tương tự? – alhelal

7

Vỏ điều khiển công việc thao tác các phiên hoặc nhóm xử lý mọi lúc. Bạn có thể gửi cùng một tín hiệu đến tất cả các quy trình trong một nhóm quá trình với một cuộc gọi đến chức năng POSIX kill().

Tiêu chuẩn POSIX nói:

Nếu pid là lớn hơn 0, sig được gửi đến các quá trình có ID quá trình bằng pid.

Nếu pid bằng 0, sig phải được gửi tới tất cả các quy trình (không bao gồm một tập hợp quy trình hệ thống không xác định) có ID nhóm tiến trình bằng ID nhóm tiến trình của người gửi và quá trình có quyền gửi tín hiệu.

Nếu pid là -1, sig phải được gửi đến tất cả các quy trình (không bao gồm một tập hợp quy trình hệ thống không xác định) mà quy trình có quyền gửi tín hiệu đó. Nếu pid là tiêu cực, nhưng không phải -1, sig sẽ được gửi đến tất cả các quy trình (không bao gồm một tập hợp các quy trình hệ thống không xác định) có ID nhóm tiến trình bằng giá trị tuyệt đối của pid và quá trình này được phép để gửi tín hiệu.

Khi vỏ đăng nhập thoát, ví dụ, tín hiệu SIGHUP được gửi đến tất cả các chương trình trong nhóm xử lý của nó.

Khi bạn thao tác các chương trình vào nền trước hoặc nền, bạn đang sử dụng các nhóm quy trình.

Ngoài ra còn có các thiết bị đầu cuối điều khiển để lo lắng; tín hiệu được tạo ra bởi một thiết bị đầu cuối điều khiển có thể được gửi đến tất cả các chương trình trong một nhóm quá trình.

Các vấn đề liên quan