2008-09-05 7 views
7

Trên Fedora Core 7, tôi đang viết một số mã dựa trên ARG_MAX. Tuy nhiên, ngay cả khi tôi #include <limits.h>, hằng số vẫn không được xác định. Điều tra của tôi cho thấy rằng nó có mặt trong <sys/linux/limits.h>, nhưng điều này được cho là di động trên Win32/Mac/Linux, vì vậy trực tiếp bao gồm nó không phải là một lựa chọn. Những gì đang xảy ra ở đây?Tại sao ARG_MAX không được xác định qua giới hạn.h?

Trả lời

8

Lý do không nằm trong giới hạn.h là không phải là số lượng đưa ra giới hạn của phạm vi giá trị của một loại tích phân dựa trên chiều rộng bit trên kiến ​​trúc hiện tại. Đó là vai trò được gán cho limits.h theo tiêu chuẩn ISO.

Giá trị mà bạn quan tâm không bị ràng buộc phần cứng trong thực tế và có thể thay đổi từ nền tảng này sang nền tảng khác và có thể xây dựng hệ thống để xây dựng hệ thống.

Điều chính xác cần làm là gọi sysconf và yêu cầu nó cho "ARG_MAX" hoặc "_POSIX_ARG_MAX". Tuy nhiên, tôi nghĩ rằng là giải pháp tuân thủ POSIX.

Acc. vào tài liệu của tôi, bạn bao gồm một hoặc cả hai unistd.h hoặc limits.h dựa trên giá trị bạn đang yêu cầu.

Một điểm khác: nhiều triển khai của họ thực hiện hàm trả về E2BIG hoặc giá trị tương tự nếu bạn cố gắng gọi chúng bằng môi trường quá khổ. Đây là một trong những điều kiện được xác định theo đó exec thực sự có thể trở lại.

-2

ARG_MAX được định nghĩa trong /usr/include/linux/limits.h. Phiên bản hạt nhân Linux của tôi là 3.2.0-38.