Apa artinya setiap proses memiliki direktori saat ini?

10

Saya membaca "Lingkungan Pemrograman Unix", tetapi saya tidak memahami konsep direktori proses saat ini.

Setiap proses, memiliki direktori saat ini , dan semua nama file secara implisit diasumsikan dimulai dengan nama direktori itu, kecuali jika mereka mulai secara langsung dengan garis miring.

Apakah ini berarti bahwa setiap proses memiliki tanda di direktori mana ia dibuat? Sebagai contoh, jika program /bin/seddipanggil dari /home/rene, lalu proses yang dibuat dari memohon apakah memiliki direktori saat ini /home/rene?

Rene Ott
sumber

Jawaban:

13

Tingkat konseptual

Saat Anda memulai proses dari shell Anda, direktori kerja saat ini dari proses adalah sama dengan direktori kerja shell Anda saat ini. Dalam konteks shell, direktori kerja saat ini adalah lokasi Anda saat ini "di."

Direktori kerja saat ini dari proses apa pun digunakan untuk menafsirkan jalur relatif. Sebagai contoh, jika direktori kerja shell Anda saat ini adalah /home/renedan Anda berlari ls ..dari shell, proses ini direktori kerja saat ini, /home/rene, akan digunakan untuk tekad ..untuk /home.

Anda dapat melihat direktori kerja saat ini dari semua proses yang berjalan di sistem Anda dengan lsof | grep '\scwd\s'(perhatikan bahwa Anda mungkin perlu menjadi root untuk melihat proses pengguna lain.) Ini dapat memberi Anda gambaran tentang bagaimana direktori kerja saat ini berhubungan dengan proses yang berjalan di sistem Anda.

Tingkat program

Direktori shell yang berfungsi saat ini adalah direktori yang Anda lihat dan modifikasi dengan built-in shell pwddan cdmasing - masing. Perintah-perintah ini memanggil panggilan sistem seperti getcwddan chdiryang berfungsi dengan direktori kerja shell Anda saat ini.

Menggunakan bashsebagai contoh, cdbuilt-in akhirnya menjalankan baris ini:

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

dan pwdbuilt-in akhirnya menjalankan baris ini:

the_current_working_directory = getcwd (0, PATH_MAX);

Shell hanyalah contoh yang mudah digunakan direktori penggunaan saat ini; panggilan sistem yang sama juga digunakan oleh program lain. Suatu program dapat mengubah direktori kerjanya saat ini ke /usrdan setiap jalur relatif yang menggunakan program akan mulai dari /usrdirektori,

Tingkat kernel

Direktori kerja saat ini dari suatu proses disimpan oleh kernel. Linux menyimpannya di pwdanggota yang fs_structditunjuk oleh fsanggota a task_struct. The pwdanggota adalah pathstruct, yang menunjuk ke informasi tentang gunung ( vfsmount) dan lokasi direktori di filesystem ( dentry). Setiap proses memiliki task_structketerkaitan dengannya.

The chdirdan getcwdsistem panggilan memodifikasi dan mengambil informasi di pwd.


sumber
Selain itu, untuk level kernel, perlu diingat bahwa ketika pemanggilan sistem dilakukan, ada penunjuk ke task_struct 'saat ini' yang tersedia - sehingga kode dieksekusi 'atas nama' proses saat ini. fs_struct dapat diakses melalui pointer ke task_struct saat ini: elixir.free-electrons.com/linux/v4.12.4/source/fs/…
Dmitrii S.
1

Setiap proses memiliki direktori kerja saat ini (CWD) yang ditugaskan ketika itu mulai. Anda dapat melakukan hal berikut untuk mengetahui direktori kerja untuk suatu proses.

Jalankan ps aux untuk mengetahui PID dari suatu proses:

$ pgrep cupsd
24532

Untuk mengetahui direktori kerja PID saat ini: 24532

$ sudo pwdx 24532
24532: /

Jadi proses (PID: 24532) memiliki CWD dari /.

Ini contoh lain:

$ sleep 1000 &
[1] 15988

$ pwdx 15988
15988: /home/sam

Kali ini proses sleep (PID: 15988) telah menetapkan CWD-nya ke direktori home saya /home/sam,.

Anda juga dapat menjalankan ls -lperintah:

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

-atau-

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

Di sini Anda dapat lagi melihat CWD untuk proses tersebut, /dan /home/sam.

Referensi

slm
sumber