/ Proc / self là cú pháp đường. Đó là một lối tắt để liên kết / Proc / và kết quả của tòa nhà getpid () (có thể truy cập trong bash dưới dạng biến thái $$). Nó có thể gây nhầm lẫn, trong trường hợp kịch bản shell, vì nhiều câu lệnh gọi các quy trình khác, hoàn thành với các bộ vi xử lý riêng ... Các bộ quy tắc đề cập đến, thường xuyên hơn là các quy trình chết. Xem xét:
root@vps01:~# ls -l /proc/self/fd
total 0
lrwx------ 1 root root 64 Jan 1 01:51 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 1 01:51 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 1 01:51 2 -> /dev/pts/0
lr-x------ 1 root root 64 Jan 1 01:51 3 -> /proc/26562/fd
root@vps01:~# echo $$
593
'/ bin / ls' sẽ đánh giá đường dẫn đến thư mục, giải quyết nó là / Proc / 26563, vì đó là PID của quy trình - quy trình mới được tạo / bin / ls - đọc nội dung của thư mục. Nhưng tại thời điểm quy trình tiếp theo trong đường ống, trong trường hợp kịch bản lệnh shell hoặc vào thời điểm dấu nhắc quay lại, trong trường hợp trình bao tương tác, đường dẫn không còn tồn tại và đầu ra thông tin đề cập đến quy trình không tồn tại.
Tuy nhiên, điều này chỉ áp dụng cho các lệnh bên ngoài (những lệnh là các tệp chương trình thực thi thực tế, trái ngược với việc được tích hợp vào chính trình bao). Vì vậy, bạn sẽ nhận được các kết quả khác nhau nếu bạn nói, sử dụng tên tệp toàn cầu để lấy danh sách nội dung của thư mục, thay vì chuyển tên đường dẫn đến tiến trình / bin / ls bên ngoài:
root@vps01:~# ls /proc/self/fd
0 1 2 3
root@vps01:~/specs# echo /proc/self/fd/*
/proc/self/fd/0 /proc/self/fd/1 /proc/self/fd/2 /proc/self/fd/255 /proc/self/fd/3
Trong dòng đầu tiên, shell đã tạo ra một quy trình mới, '/ bin / ls', thông qua tòa nhà exec (), truyền "/ Proc / self / fd" như argv [1]. Lần lượt '/ bin / ls', mở thư mục / Proc / self / fd và đọc, sau đó in, nội dung của nó khi nó lặp đi lặp lại trên chúng.
Tuy nhiên, dòng thứ hai sử dụng global () đằng sau hậu trường để mở rộng danh sách tên tệp; chúng được truyền dưới dạng một chuỗi các chuỗi để lặp lại. (Thường được triển khai như một lệnh nội bộ, nhưng thường cũng có nhị phân / bin / echo ... nhưng phần đó thực sự không liên quan, vì echo chỉ xử lý các chuỗi mà nó không bao giờ cung cấp cho bất kỳ tòa nhà nào liên quan đến tên đường dẫn.)
Bây giờ, hãy xem xét trường hợp sau:
root@vps01:~# cd /proc/self/fd
root@vps01:~# ls
0 1 2 255
Ở đây, shell, tiến trình cha của / bin / ls, đã tạo một thư mục con của / Proc / self thư mục hiện tại của nó . Do đó, tên đường dẫn tương đối được đánh giá từ quan điểm của nó. Tôi đoán tốt nhất là điều này có liên quan đến ngữ nghĩa tệp POSIX nơi bạn có thể tạo nhiều liên kết cứng đến một tệp, bao gồm mọi mô tả tệp mở. Vì vậy, lần này, / bin / ls hoạt động tương tự như echo / Proc / $$ / fd / *.
/proc/self
, tất nhiên.