แต่ละกระบวนการมีไดเรกทอรีปัจจุบันหมายความว่าอย่างไร


10

ฉันกำลังอ่าน "สภาพแวดล้อมการเขียนโปรแกรม Unix" แต่ฉันไม่เข้าใจไดเรกทอรีแนวคิดปัจจุบันของกระบวนการ

แต่ละกระบวนการมีไดเรกทอรีปัจจุบันและชื่อไฟล์ทั้งหมดจะถูกสันนิษฐานโดยปริยายว่าเริ่มต้นด้วยชื่อของไดเรกทอรีนั้นเว้นแต่ว่าพวกเขาจะเริ่มต้นโดยตรงด้วยเครื่องหมายทับ

หมายความว่าทุกกระบวนการมีการลงชื่อเข้าใช้ในไดเรกทอรีใดที่ถูกสร้างขึ้น? ตัวอย่างเช่นหากโปรแกรม/bin/sedถูกเรียกใช้จาก/home/reneนั้นกระบวนการที่สร้างขึ้นจากการเรียก sed มีไดเรกทอรีปัจจุบัน/home/reneหรือไม่

คำตอบ:


13

ระดับแนวคิด

เมื่อคุณเริ่มต้นกระบวนการจากเชลล์ของคุณไดเร็กทอรีการทำงานปัจจุบันของกระบวนการจะเหมือนกับไดเร็กทอรีการทำงานปัจจุบันของเชลล์ของคุณ ในบริบทของเชลล์ไดเร็กทอรีการทำงานปัจจุบันคือตำแหน่งที่คุณอยู่ "at"

ไดเรกทอรีการทำงานปัจจุบันของกระบวนการใด ๆ ที่ใช้ในการตีความเส้นทางญาติ ตัวอย่างเช่นถ้าไดเรกทอรีการทำงานเปลือกของคุณในปัจจุบันเป็น/home/reneและคุณวิ่งls ..จากเปลือกกระบวนการไดเรกทอรีทำงานปัจจุบัน/home/reneก็จะถูกนำมาใช้เพื่อแก้ปัญหาการ../home

คุณสามารถดูไดเรกทอรีการทำงานปัจจุบันของกระบวนการทั้งหมดที่ทำงานบนระบบของคุณด้วยlsof | grep '\scwd\s'(โปรดทราบว่าคุณอาจต้องรูทเพื่อดูกระบวนการของผู้ใช้คนอื่น ๆ ) สิ่งนี้จะช่วยให้คุณทราบว่าไดเรกทอรีทำงานปัจจุบันเกี่ยวข้องกับ กระบวนการทำงานบนระบบของคุณ

ระดับโปรแกรม

ไดเร็กทอรีการทำงานปัจจุบันของเชลล์คือไดเร็กทอรีที่คุณเห็นและแก้ไขด้วยเชลล์ในตัวpwdและcdตามลำดับ คำสั่งเหล่านี้เรียกการเรียกของระบบเช่นgetcwdและchdirทำงานกับไดเรกทอรีการทำงานปัจจุบันของเชลล์ของคุณ

เมื่อใช้bashเป็นตัวอย่างแล้วcdบิวด์อินจะรันบรรทัดนี้ในที่สุด:

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

และpwdในที่สุดก็ทำงานในบรรทัดนี้:

the_current_working_directory = getcwd (0, PATH_MAX);

เชลล์เป็นเพียงตัวอย่างที่สะดวกของการใช้งานไดเร็กตอรี่ปัจจุบัน; การเรียกระบบเดียวกันเหล่านี้ถูกใช้โดยโปรแกรมอื่นเช่นกัน โปรแกรมสามารถเปลี่ยนไดเรกทอรีการทำงานปัจจุบันเป็น/usrและเส้นทางสัมพัทธ์ใด ๆ ที่โปรแกรมใช้จะเริ่มจาก/usrไดเรกทอรี

ระดับเคอร์เนล

ไดเร็กทอรีการทำงานปัจจุบันของกระบวนการถูกเก็บไว้โดยเคอร์เนล ร้านค้าลินุกซ์ในpwdสมาชิกของfs_structชี้ไปตามสมาชิกของfs สมาชิกเป็นstruct ซึ่งชี้ไปข้อมูลเกี่ยวกับการติดตั้ง ( ) และสถานที่ไดเรกทอรีในระบบแฟ้ม ( ) แต่ละกระบวนการมีความเกี่ยวข้องกับมันtask_structpwdpathvfsmountdentrytask_struct

chdirและระบบโทรแก้ไขและเรียกคืนข้อมูลในgetcwdpwd


นอกจากนี้สำหรับระดับเคอร์เนลมันมีประโยชน์ที่ต้องจำไว้ว่าเมื่อมีการเรียกระบบจะมีตัวชี้ไปยัง 'task_struct' ปัจจุบัน 'ที่มีอยู่ - ดังนั้นรหัสจะถูกดำเนินการ' ในนามของ 'กระบวนการปัจจุบัน fs_struct สามารถเข้าถึงได้ผ่านตัวชี้ไปยัง task_struct ปัจจุบัน: elixir.free-electrons.com/linux/v4.12.4/source/fs/…
Dmitrii S.

1

ทุกกระบวนการมีไดเรกทอรีการทำงานปัจจุบัน (CWD) ที่ได้รับมอบหมายเมื่อเริ่มต้น คุณสามารถทำสิ่งต่อไปนี้เพื่อค้นหาไดเรกทอรีทำงานสำหรับกระบวนการ

เรียกใช้ ps aux เพื่อค้นหา PID ของกระบวนการ:

$ pgrep cupsd
24532

หากต้องการค้นหาไดเรกทอรีการทำงานปัจจุบันของ PID: 24532

$ sudo pwdx 24532
24532: /

ดังนั้นกระบวนการ (PID: 24532) มี CWD /ของ

นี่เป็นอีกตัวอย่าง:

$ sleep 1000 &
[1] 15988

$ pwdx 15988
15988: /home/sam

เวลานี้กระบวนการสลีป (PID: 15988) ตั้ง CWD ไว้ที่โฮมไดเร็กตอรี่ของฉัน, /home/sam.

คุณยังสามารถเรียกใช้ls -lคำสั่ง:

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

-หรือ-

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

ที่นี่คุณสามารถมองเห็นอีกครั้ง CWD สำหรับกระบวนการเหล่านั้นและ//home/sam

อ้างอิง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.