2009-07-23 30 views
5

Tôi biết có thể lấy đường dẫn tuyệt đối của tệp bằng hàm realpath(). Tuy nhiên, theo BUGS phần manpage, có một số vấn đề trong việc thực hiện nó. Các chi tiết được như sau:Làm thế nào để có được đường dẫn tuyệt đối của một tập tin lập trình với realpath() dưới Linux?


LỖI

Tránh sử dụng chức năng này. Nó bị hỏng bởi thiết kế kể từ khi (trừ khi sử dụng tính năng resol_path == NULL không chuẩn) không thể xác định kích thước phù hợp cho bộ đệm đầu ra, resolve_path. Theo POSIX một bộ đệm có kích thước PATH_MAX đủ, nhưng PATH_MAX không cần phải là một hằng số xác định, và có thể phải thu được bằng cách sử dụng pathconf (3). Và yêu cầu pathconf (3) không thực sự hữu ích, vì trên một mặt POSIX cảnh báo rằng kết quả của pathconf (3) có thể rất lớn và không phù hợp với bộ nhớ mallocing. Và mặt khác pathconf (3) có thể trả về -1 để biểu thị rằng PATH_MAX không bị ràng buộc.

Việc triển khai libc4 và libc5 chứa tràn bộ đệm (cố định trong libc-5.4.13). Do đó, các chương trình ID người dùng thiết lập như mount (8) cần một phiên bản riêng.


Vì vậy, câu hỏi là cách tốt nhất để có được đường dẫn tuyệt đối của tệp là gì?

+0

Bản sao "[Lập trình truy xuất đường dẫn tuyệt đối của ứng dụng dòng lệnh OS X] (http://stackoverflow.com/questions/799679/programatically-retrieving-the-absolute-path-of-an-os- x-command-line-app) "? – bortzmeyer

+0

Không. Chúng không giống nhau. Tôi muốn biết làm thế nào để có được đường dẫn tuyệt đối của một tập tin bình thường chứ không phải là con đường thực thi. – jcadam

Trả lời

2

Từ vỏ, tôi có thể có đường dẫn đầy đủ bằng cách sử dụng readlink -f $FILE. Có chức năng readlink() trong glibc, có thể điều đó sẽ giúp bạn.

# man 2 readlink 
+0

Tôi đã đọc mã nguồn của lệnh readlink trong gói coreutils. Có một giải pháp đơn giản, chỉ cần xác định PATH_MAX đến 1024 !!!! -__- !!! – jcadam

3

Sử dụng getcwd() và readlink() cho phép kích thước bộ đệm để thực hiện lại đường dẫn thực(). Lưu ý rằng bạn phải giải quyết các liên kết tượng trưng, ​​"." và ".." từ trái sang phải để làm điều đó một cách chính xác.

5

Tôi biết câu hỏi này cũ, nhưng tôi không thấy bất kỳ câu trả lời nào giải quyết vấn đề cốt lõi: Trang người đàn ông OP được tham chiếu là sai và đã lỗi thời, vì ít nhất hai lý do.

Một là POSIX 2008 đã thêm/ủy quyền hỗ trợ cho tùy chọn đối số NULL, theo đó realpath phân bổ chuỗi cho bạn. Các chương trình sử dụng tính năng này sẽ được chuyển sang tất cả các phiên bản GNU/Linux có liên quan, có thể là hầu hết các hệ thống hiện đại khác và bất kỳ điều gì phù hợp với POSIX 2008.

Lý do thứ hai là trang bị nhầm lẫn là vi phạm PATH_MAX. Đây hoàn toàn là hệ tư tưởng tôn giáo của GNU chống lại "giới hạn tùy ý". Trong thế giới thực, không có giới hạn độ dài đường dẫn sẽ thêm tất cả các loại đường cho lạm dụng/DoS, sẽ thêm nhiều trường hợp lỗi cho các tác vụ không thể thất bại và sẽ phá vỡ nhiều giao diện hơn chỉ là realpath.

Nếu bạn quan tâm đến tính di động tối đa, tốt nhất nên sử dụng kết hợp cả hai phương pháp. Xem tài liệu POSIX để biết chi tiết:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/realpath.html

Tôi sẽ sử dụng một kích thước cố định, người gọi-cung cấp đệm nếu PATH_MAX được xác định, và nếu không vượt qua NULL. Điều này dường như bao gồm tất cả các trường hợp, nhưng bạn cũng có thể muốn kiểm tra các phiên bản cũ hơn của POSIX để xem liệu họ có bất kỳ hướng dẫn nào về việc cần làm không nếu không xác định được PATH_MAX.

Các vấn đề liên quan