Почему ARG_MAX не определен с помощью limit.h? - PullRequest
7 голосов
/ 05 сентября 2008

В Fedora Core 7 я пишу код, который опирается на ARG_MAX. Однако, даже если I #include <limits.h>, константа все равно не определена. Мои исследования показывают, что он присутствует в <sys/linux/limits.h>, но он должен быть переносимым через Win32 / Mac / Linux, поэтому напрямую включать его нельзя. Что здесь происходит?

Ответы [ 2 ]

8 голосов
/ 06 сентября 2008

Причина, по которой он не находится в пределах .h, состоит в том, что это не величина, задающая пределы диапазона значений целочисленного типа на основе ширины в текущей архитектуре. Эта роль назначена limit.h по стандарту ISO.

Значение, которое вас интересует, на практике не зависит от аппаратного обеспечения и может варьироваться от платформы к платформе и, возможно, от сборки системы до сборки системы.

Правильно сделать, это позвонить sysconf и спросить его «ARG_MAX» или «_POSIX_ARG_MAX». Я думаю, это все равно POSIX-совместимое решение.

Точность. в мою документацию вы включаете один или оба файла unistd.h или limit.h в зависимости от того, какие значения запрашиваете.

Еще один момент: многие реализации семейства функций exec возвращают E2BIG или аналогичное значение, если вы пытаетесь вызывать их в слишком большой среде. Это одно из определенных условий, при которых exec может фактически вернуться.

0 голосов
/ 12 февраля 2013

ARG_MAX определен в /usr/include/linux/limits.h. Моя версия ядра Linux - 3.2.0-38.

...