Câu trả lời:
Trong Linux, mọi quy trình đều có một số ID được liên kết với nó, bao gồm:
ID tiến trình (PID)
Đây là một số tùy ý xác định quy trình. Mỗi quy trình có một ID duy nhất, nhưng sau khi quy trình thoát và quy trình cha đã lấy trạng thái thoát, ID quy trình được giải phóng để được sử dụng lại bởi một quy trình mới.
ID tiến trình cha mẹ (PPID)
Đây chỉ là PID của quá trình bắt đầu quá trình được đề cập.
ID nhóm quy trình (PGID)
Đây chỉ là PID của người lãnh đạo nhóm quy trình. Nếu PID == PGID, thì quá trình này là trưởng nhóm quy trình.
ID phiên (SID)
Đây chỉ là PID của người lãnh đạo phiên. Nếu PID == SID, thì quá trình này là một nhà lãnh đạo phiên.
Phiên và nhóm quy trình chỉ là cách để coi một số quy trình liên quan là một đơn vị. Tất cả các thành viên của một nhóm quy trình luôn thuộc về cùng một phiên, nhưng một phiên có thể có nhiều nhóm quy trình.
Thông thường, một shell sẽ là một người dẫn đầu phiên và mọi đường ống được thực hiện bởi shell đó sẽ là một nhóm quy trình. Điều này là để làm cho nó dễ dàng để giết những đứa trẻ của một cái vỏ khi nó thoát ra. (Xem lối ra (3) để biết chi tiết về tin đồn.)
Tôi không nghĩ có một điều khoản đặc biệt cho một thành viên của một phiên hoặc nhóm quy trình không phải là người lãnh đạo.
Một người lãnh đạo phiên là một quá trình trong đó phiên id == process id. Điều này nghe có vẻ khó khăn, nhưng id phiên được kế thừa bởi các tiến trình con. Một số hoạt động trong UNIX / Linux hoạt động trên các phiên quy trình, ví dụ, phủ định id tiến trình khi gửi đến lệnh gọi hoặc lệnh hệ thống tiêu diệt. Việc sử dụng phổ biến nhất cho việc này là khi đăng xuất khỏi vỏ. HĐH sẽ gửi kill -HUP -$$
, sẽ gửi tín hiệu SIGHUP (gác máy) cho tất cả các quy trình có cùng id phiên như trình bao. Khi bạn từ chối một quy trình, id phiên của quy trình được thay đổi từ trình bao, do đó, nó sẽ không phản hồi tín hiệu gác máy. Đây là một phần của quy trình để trở thành quy trình daemon.
Hầu hết các quy trình được gọi từ trình quản lý cửa sổ / môi trường đồ họa có cùng id phiên với một trong các chương trình khởi động. Điều này cho phép HĐH thực hiện cùng một kill -HUP -$$
hoạt động trên tất cả các chương trình: chẳng hạn như trình duyệt, trình phát nhạc, libreoffice, ứng dụng khách IM, v.v ... Đây là những quy trình không phải là người dẫn đầu phiên.
Tôi nghĩ rằng tôi biết câu trả lời cho điều này, nhưng tôi đã viết một chương trình C để tìm ra điều này.
#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
pid_t sid, mypid, pgid, gid;
mypid = getpid();
sid = getsid(0);
pgid = getpgid(0);
gid = getpgrp();
printf("PID %d\n", mypid);
printf("process group ID of session leader: %d\n", sid);
printf("process group ID: %d\n", pgid);
printf("process group ID: %d\n", gid);
if (!fork())
{
mypid = getpid();
sid = getsid(0);
pgid = getpgid(0);
gid = getpgrp();
printf("child PID %d\n", mypid);
printf("process group ID of session leader: %d\n", sid);
printf("process group ID: %d\n", pgid);
printf("process group ID: %d\n", gid);
_exit(0);
}
return 0;
}
Tôi đã biên dịch nó với cc -g -o sid sid.c
tôi chạy nó theo một vài cách khác nhau, để xem điều gì xảy ra:
./sid
nohup ./sid > sid.out
setsid ./sid
Tôi đã rất ngạc nhiên bởi những gì Linux (2.6,39) đã trả lại. Tôi cũng tìm thấy phần 7 trang man, "thông tin đăng nhập".
Lời khuyên của tôi là hãy làm man 7 credentials
(hoặc tương đương nếu không có trên Linux) và đọc phần về nhóm quy trình và phiên để xem bạn có thể giải đố được không.
./sid
và nohup ./sid
, và khi bạn chạy setsid ./sid
, id phiên (SID) là thương hiệu mới và cũng giống như quá trình PID ... Tôi Tôi không chắc tại sao nohup ngăn ngã ba (hoặc dường như), nhưng tôi nghĩ rằng tôi đã có ý tưởng chung ...
ps xao pid,ppid,pgid,sid,comm
để xem các ID này.