Cho đường dẫn đến tệp hoặc thư mục, làm thế nào tôi có thể xác định điểm gắn kết cho tệp đó? Ví dụ: nếu /tmp
được gắn dưới dạng hệ thống tệp tmpfs
thì hãy đặt tên tệp là /tmp/foo/bar
Tôi muốn biết rằng tệp được lưu trữ trên số tmpfs
bắt nguồn từ số /tmp
.Tệp được gắn ở đâu?
Điều này sẽ ở trong C++ và tôi muốn tránh gọi các lệnh bên ngoài qua system()
. Mã phải mạnh mẽ - không nhất thiết phải chống lại cố ý giả mạo nhưng chắc chắn đối mặt với các điểm gắn kết lồng nhau, liên kết tượng trưng, v.v.
Tôi chưa thể tìm thấy một cuộc gọi hệ thống đơn giản để thực hiện việc này. Có vẻ như tôi sẽ phải tự mình viết séc. Đây là một phác thảo sơ lược về những gì tôi đang lên kế hoạch.
- Canonicalize the name name a la the
readlink
shell command. Làm cách nào? - Đọc
/etc/mtab
vớigetmntent()
& co. - Xác định mục nhập gắn kết tương ứng cho tệp. Làm cách nào?
Đối # 1 là có một hệ thống gọi đơn giản hay sao tôi cần phải đọc mỗi thành phần thư mục của con đường và giải quyết chúng với readlink(2)
nếu họ liên kết tượng trưng? Và xử lý .
và ..
bản thân mình? Có vẻ như là một cơn đau.
Đối với # 3 tôi có nhiều ý tưởng về cách thực hiện việc này. Không chắc cái nào là tốt nhất.
open()
file, mẹ, mẹ mẹ, vv sử dụngopenat(fd, "..")
cho đến khi tôi đạt được một trong những/etc/mtab
mục. (Làm cách nào để biết khi nào?fstat()
chúng và so sánh các số inode?)- Tìm tên thư mục dài nhất trong bảng gắn kết là một chuỗi con của tên tệp của tôi.
Tôi nghiêng về tùy chọn đầu tiên nhưng trước khi tôi mã hóa tất cả, tôi muốn đảm bảo rằng tôi không nhìn thấy gì cả - lý tưởng là chức năng tích hợp đã thực hiện điều này!
Tại sao lại bỏ phiếu này? Đó là một câu hỏi hay. –
Bất cứ ai đã bỏ phiếu để đóng nó có lẽ chỉ cần đọc tiêu đề và/hoặc hai dòng đầu tiên. Đây rõ ràng là một câu hỏi thích hợp (và thú vị). –
Xem thêm [Phiên bản Python] (http://stackoverflow.com/questions/4260116/find-size-and-free-space-of-the-filesystem-containing-a-given-file) và [lệnh trình bao] (http://stackoverflow.com/questions/3274354/how-to-find-out-mount-partition-a-directory-or-file-is-on-linux-server). –