Điều đó có nghĩa là gì mỗi quá trình có một thư mục hiện tại?


10

Tôi đang đọc "Môi trường lập trình Unix", nhưng tôi không hiểu được thư mục hiện tại của quy trình.

Mỗi quy trình, có một thư mục hiện tại và tất cả các tên tệp được mặc định bắt đầu bằng tên của thư mục đó, trừ khi chúng bắt đầu trực tiếp bằng dấu gạch chéo.

Có nghĩa là mọi quá trình đều có một dấu hiệu trong thư mục được tạo? Ví dụ, nếu chương trình /bin/sedđược gọi từ /home/rene, thì quá trình được tạo từ inv sed có thư mục hiện tại /home/renekhông?

Câu trả lời:


13

Cấp khái niệm

Khi bạn bắt đầu một tiến trình từ shell của mình, thư mục làm việc hiện tại của tiến trình này giống như thư mục làm việc hiện tại của shell của bạn. Trong ngữ cảnh của trình bao, thư mục làm việc hiện tại là vị trí bạn hiện đang "tại."

Thư mục làm việc hiện tại của bất kỳ quá trình được sử dụng để giải thích các đường dẫn tương đối. Ví dụ, nếu thư mục làm việc hiện tại của shell của bạn đã /home/renevà bạn chạy ls ..từ vỏ, thư mục làm việc hiện hành của quá trình, /home/rene, sẽ được sử dụng để quyết tâm ..đến /home.

Bạn có thể xem các thư mục làm việc hiện tại của tất cả các quy trình đang chạy trên hệ thống của bạn lsof | grep '\scwd\s'(lưu ý rằng có lẽ bạn sẽ cần phải root để xem các quy trình của người dùng khác.) Điều này có thể cho bạn biết về cách các thư mục làm việc hiện tại liên quan đến các quy trình đang chạy trên hệ thống của bạn.

Cấp chương trình

Thư mục làm việc hiện tại của shell là thư mục bạn nhìn thấy và sửa đổi với shell được tích hợp sẵn pwdcdtương ứng. Các lệnh này gọi các cuộc gọi hệ thống như getcwdchdirhoạt động với thư mục làm việc hiện tại của shell của bạn.

Sử dụng bashlàm ví dụ, cdcuối cùng tích hợp chạy dòng này:

if (chdir (nolinks ? newdir : tdir) == 0)

và tích pwdhợp cuối cùng chạy dòng này:

the_current_working_directory = getcwd (0, PATH_MAX);

Shell chỉ là một ví dụ thuận tiện cho việc sử dụng thư mục làm việc hiện tại; các cuộc gọi hệ thống tương tự cũng được sử dụng bởi các chương trình khác. Một chương trình có thể thay đổi thư mục làm việc hiện tại của nó thành /usrvà bất kỳ đường dẫn tương đối nào mà chương trình sử dụng sẽ bắt đầu từ /usrthư mục,

Cấp hạt nhân

Thư mục làm việc hiện tại của một tiến trình được lưu trữ bởi kernel. Linux lưu trữ nó trong pwdthành viên của một fs_structtrỏ đến bởi fsthành viên của một task_struct. Thành pwdviên là một pathcấu trúc, trỏ đến thông tin về mount ( vfsmount) và vị trí của thư mục trong hệ thống tập tin ( dentry). Mỗi quá trình có một task_structliên kết với nó.

Các cuộc gọi chdirgetcwdhệ thống sửa đổi và lấy thông tin trong pwd.


Ngoài ra, đối với cấp hạt nhân, bạn nên nhớ rằng khi thực hiện cuộc gọi hệ thống, sẽ có một con trỏ tới 'hiện tại' task_struct - vì vậy mã được thực thi 'thay mặt cho' quy trình hiện tại. fs_struct có thể được truy cập thông qua con trỏ tới task_struct hiện tại: elixir.free-electrons.com/linux/v4.12.4/source/fs/ Lỗi
Dmitrii S.

1

Mọi quy trình đều có một thư mục làm việc hiện tại (CWD) mà nó được gán khi nó khởi động. Bạn có thể làm như sau để tìm ra thư mục làm việc cho một quy trình.

Chạy ps aux để tìm ra PID của một tiến trình:

$ pgrep cupsd
24532

Để tìm ra thư mục làm việc hiện tại của một PID: 24532

$ sudo pwdx 24532
24532: /

Vì vậy, quá trình (PID: 24532) có CWD là /.

Đây là một ví dụ khác:

$ sleep 1000 &
[1] 15988

$ pwdx 15988
15988: /home/sam

Lần này, quá trình ngủ (PID: 15988) có CWD được đặt vào thư mục nhà của tôi , /home/sam.

Bạn cũng có thể chạy ls -llệnh:

$ sudo ls -l /proc/24532/cwd
lrwxrwxrwx 1 root root 0 Apr 30 19:18 /proc/24532/cwd -> /

-hoặc là-

$ ls -l /proc/15988/cwd
lrwxrwxrwx 1 sam sam 0 Apr 30 19:23 /proc/15988/cwd -> /home/sam

Tại đây bạn có thể thấy lại CWD cho các quy trình đó //home/sam.

Người giới thiệu

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.