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





Причина, по которой он не находится в limits.h, заключается в том, что это не величина, дающая пределы диапазона значений интегрального типа на основе разрядности в текущей архитектуре. Эта роль отводится limit.h стандартом ISO.
Значение, которое вас интересует, на практике не привязано к оборудованию и может варьироваться от платформы к платформе и, возможно, от сборки к сборке системы.
Правильнее всего вызвать sysconf и запросить «ARG_MAX» или «_POSIX_ARG_MAX». Я считать, в любом случае, это POSIX-совместимое решение.
В соотв. в мою документацию вы включаете один или оба из unistd.h или limits.h в зависимости от того, какие значения вы запрашиваете.
Еще один момент: многие реализации семейства функций exec возвращают E2BIG или подобное значение, если вы пытаетесь вызвать их в среде слишком большого размера. Это одно из определенных условий, при которых exec может действительно вернуться.
ARG_MAX определен в /usr/include/linux/limits.h. Моя версия ядра Linux - 3.2.0-38.
Принятый ответ объясняет это довольно хорошо, вы не должны полагаться на это значение для своей сборки, поскольку оно может варьироваться от системы к системе. Это интересно только для сборки, которая специализируется на вашей конкретной системе и, вероятно, заполняется вашим скриптом настройки.