W Fedorze Core 7, piszę kod, który polega na ARG_MAX
. Jednak nawet jeśli I #include <limits.h>
, stała nadal nie jest zdefiniowana. Moje badania pokazują, że jest on obecny w <sys/linux/limits.h>
, ale ma być przenośny w całej Win32/Mac/Linux, więc bezpośrednie włączenie go nie jest opcją. Co tu się dzieje?Dlaczego ARG_MAX nie jest zdefiniowany przez limits.h?
Odpowiedz
Powodem tego nie jest limit.h to, że nie jest to ilość podająca granice zakresu wartości typu całkowego w oparciu o szerokość bitową w aktualnej architekturze. To jest rola przypisana limit.h przez standard ISO.
Wartość, która cię interesuje, nie jest związana ze sprzętem w praktyce i może się różnić w zależności od platformy, a być może nawet kompilacji systemu do kompilacji systemu.
Prawidłowe jest wywołanie sysconf
i pytanie "ARG_MAX" lub "_POSIX_ARG_MAX". I think to i tak zgodne z POSIX rozwiązanie.
Acc. do mojej dokumentacji dołączasz jeden lub oba z unistd.h lub limits.h na podstawie żądanych wartości.
Jeszcze jeden punkt: wiele implementacji rodziny funkcji exec zwraca E2BIG lub podobną wartość, jeśli próbujesz wywołać je w zbyt dużym środowisku. Jest to jeden ze zdefiniowanych warunków, w których exec może faktycznie powrócić.
ARG_MAX jest zdefiniowane w /usr/include/linux/limits.h. Moja wersja jądra Linuksa to 3.2.0-38.