Я пишу программу для своей школы.Проверьте, нет ли env
Мне нужно использовать термин env, но если корректоры начнут мою программу с env -i, моя программа segfault.
Как избежать пустого env в C при запуске моей программы?
Благодаря
Я пишу программу для своей школы.Проверьте, нет ли env
Мне нужно использовать термин env, но если корректоры начнут мою программу с env -i, моя программа segfault.
Как избежать пустого env в C при запуске моей программы?
Благодаря
В нормальном случае ::
#include <stdio.h>
main (int argc, char **argv, char **env)
{
// Do Something.
char *envHomepath;
envHomepath = getenv("HOME");
if (envHomepath == NULL)
printf("HOME env is NULL\n");
else
printf("HOME env is %s\n", envHomepath);
return 0;
}
затем Это будет выведена на консоль
HOME окр является /user/xxxxx.xxx < - это ваше имя пользователя.
У вас есть несколько способов доступа к окружающей среде:
int main(int argc, char **argv, char **envp);
)char **environ;
)"VARNAME=value"
.среда всегда присутствует, так как она обычно передается процессу через exec(2)
системного вызова от родительского процесса (в UNIX и MS-DOS/Windows систем) в качестве группы NUL (\ 0) прекращается строки, за которыми следует nul (другой \ 0, следующий за последней строкой), поэтому конец окружения может быть двумя последовательностями nul (так оно передается по msdos, в других организациях вы можете иметь другой способ сделать это). Нулевой средой было бы передать пустой массив строк (просто указатель NULL
, чтобы сигнализировать об окончании окружения).
Несмотря на это, то, что main()
получает (и environ
переменных также) является массив char
указателей на строки (обычно получает с помощью основного исполнения C), а затем NULL
указателя на сигнал от конца, так пустая среда было бы что-то вроде:
char **environ = { NULL }; /* at least a NULL pointer to indicate the end of the environment */
Если вы проверяете для этого (if (environ[0] == NULL)
), вы получите представление о пустой среде. Помните, что вы должны явно вызвать правильный вызов exec (2), чтобы включить пустой массив строк окружения, чтобы это произошло. Это очень необычный случай, и, вероятно, вы столкнетесь с проблемой, если попытаетесь вызвать множество стандартных программ с пустой средой.
То же самое относится к списку аргументов, в этом случае почти все объединения следуют за соглашением о размещении NULL в argv [argc], и вы можете сделать то же самое, но будьте осторожны, поскольку у вас почти всегда есть одна строка (название программы), так
env
поступает в основном с:
int argc = 1;
char **argv = { "env", NULL };
и
env -i
будет принят в основном, как:
int argc = 2;
char **argv = { "env", "-i", NULL };
Кроме того, это возможно (в UNIX, а не в MS-DOS), чтобы передать пустой список Arg. Это очень необычно и зависит от архитектуры (linux использует его для запроса общего исполняемого файла --- .so-файла --- какие зависимости он имеет) Поэтому очень редко можно ожидать пустой список аргументов.
Вы можете обнаружить его, проверяя if (argc == 0)
, например.
Я говорю из памяти, но я думаю, что соглашение о размещении NULL
в конце списка argv
- это соглашение POSIX. Комментарии приветствуются.
Убедитесь, что указатель, возвращенный ['getenv'] (http://man7.org/linux/man-pages/man3/getenv.3.html), не является' NULL'? И не делайте код для какой-либо конкретной среды, если у вас нет резервной копии по умолчанию. –
Использование getenv запрещено правилами упражнений. – Teldar
Simillar to [this] (http://stackoverflow.com/questions/2085302/printing-all-environment-variables-in-c-c) вопрос. Обратите внимание, что, перебирая их все, строка ('thisEnv' в этом примере) будет содержать ** variable = somthing **, как в' TERM = vt100', так что вам тоже придется ее пропустить. –