/ proc / <pid> / exe symlink แตกต่างจาก symlink ทั่วไปอย่างไร


23

หากฉันเริ่มต้นกระบวนการแล้วลบไบนารีของมันฉันยังคงสามารถกู้คืนได้จาก/proc/<pid>/exe:

$ cp `which sleep` .
$ ./sleep 10m &
[1] 13728
$ rm sleep
$ readlink /proc/13728/exe                           
/tmp/sleep (deleted)
$ cp /proc/13728/exe ./sleep-copy
$ diff sleep-copy `which sleep` && echo not different
not different
$ stat /proc/13728/exe 
  File: ‘/proc/13728/exe’ -> ‘/tmp/sleep (deleted)’
  Size: 0           Blocks: 0          IO Block: 1024   symbolic link

ในทางกลับกันหากฉันสร้างลิงก์สัญลักษณ์ด้วยตนเองให้ลบเป้าหมายและพยายามคัดลอก:

cp: cannot stat ‘sleep’: No such file or directory

/procเป็นส่วนต่อประสานกับเคอร์เนล ดังนั้นลิงก์สัญลักษณ์นี้ชี้ไปที่สำเนาที่โหลดในหน่วยความจำจริง ๆ แต่มีชื่อที่มีประโยชน์มากกว่านี้หรือไม่? วิธีการที่ไม่exeทำงานเชื่อมโยงว่า?

คำตอบ:


19

/proc/<pid>/exeไม่ปฏิบัติตามความหมายปกติสำหรับลิงก์สัญลักษณ์ ในทางเทคนิคสิ่งนี้อาจนับเป็นการละเมิด POSIX แต่/procเป็นระบบไฟล์พิเศษหลังจากทั้งหมด

/proc/<pid>/exeดูเหมือนจะเป็น symlink เมื่อคุณstatมัน นี่เป็นวิธีที่สะดวกสำหรับเคอร์เนลที่จะส่งออกชื่อพา ธ ที่ทราบสำหรับการประมวลผลของกระบวนการ แต่เมื่อคุณเปิดไฟล์ "นั้น" จริงๆแล้วไม่มีขั้นตอนปกติในการอ่านเนื้อหาของ symlink ดังต่อไปนี้ แต่เคอร์เนลให้คุณเข้าถึงรายการไฟล์ที่เปิดได้โดยตรง

ขอให้สังเกตว่าเมื่อคุณpseudofile สำหรับกระบวนการที่มีการปฏิบัติการได้รับการลบเป้าหมาย symlink มีสตริง "(ลบ)" ในตอนท้ายของมัน ปกติแล้วการทำเช่นนี้จะไม่ทำให้เกิดความรู้สึกใน symlink: ไม่มีไฟล์ที่อยู่ในพา ธ เป้าหมายที่มีชื่อลงท้ายด้วย "(ถูกลบ)"ls -l/proc/<pid>/exe

TL; DRprocการดำเนินงานระบบแฟ้มเพียงไม่สิ่งวิเศษของตัวเองด้วยความละเอียดชื่อพา ธ


1
และเวทมนตร์อาศัยอยู่proc_exe_link()ในprocระบบแฟ้ม: lxr.free-electrons.com/source/fs/proc/base.c?v=4.0#L1350
Stephen Kitt

คุณจะรู้ได้อย่างไรว่าไฟล์นั้นไม่มีชื่ออย่างแน่นอน? อาจมีคนสร้างการทดลองขึ้นมา ฉันเคยทำมาก่อน ไม่น่าเป็นไปได้ว่ามันจะมีอยู่ด้วยเหตุผลอื่นใด แต่ก็ยังไม่ได้
flarn2006

4

ตาม man page ของ / proc ภายใต้ Linux 2.2 และใหม่กว่าไฟล์นั้นเป็นลิงค์สัญลักษณ์ที่มีชื่อพา ธ ที่แท้จริงของคำสั่งที่เรียกใช้งาน เห็นได้ชัดว่าไบนารีจะโหลดลงในหน่วยความจำและ/proc/[pid]/exeจุดกับเนื้อหาของไบนารีในหน่วยความจำ

ในทางตรงกันข้ามภายใต้ Linux 2.0 และรุ่นก่อนหน้านี้/proc/[pid]/exeจะเห็นว่าเป็นตัวชี้ไปยังไฟล์ (ในระบบไฟล์) ซึ่งถูกเรียกใช้งาน

ดังนั้นหากคุณเรียกใช้รายการคำสั่งเดียวกันบน Linux 2.0 หรือก่อนหน้านั้นคุณอาจได้รับข้อผิดพลาด "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว"


หน้าไหน linux.die.net/man/5/procและmanpages.ubuntu.com/manpages/utopic/en/man5/proc.5.htmlพูดว่า "ความพยายามที่จะเปิดมันจะเปิดไฟล์ปฏิบัติการ" แต่ไม่ได้บอกว่าอยู่ตรงไหน มาจาก.
muru

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