2015-01-07 4 views
0

Я пишу программу для своей школы.Проверьте, нет ли env

Мне нужно использовать термин env, но если корректоры начнут мою программу с env -i, моя программа segfault.

Как избежать пустого env в C при запуске моей программы?

Благодаря

+0

Убедитесь, что указатель, возвращенный ['getenv'] (http://man7.org/linux/man-pages/man3/getenv.3.html), не является' NULL'? И не делайте код для какой-либо конкретной среды, если у вас нет резервной копии по умолчанию. –

+0

Использование getenv запрещено правилами упражнений. – Teldar

+0

Simillar to [this] (http://stackoverflow.com/questions/2085302/printing-all-environment-variables-in-c-c) вопрос. Обратите внимание, что, перебирая их все, строка ('thisEnv' в этом примере) будет содержать ** variable = somthing **, как в' TERM = vt100', так что вам тоже придется ее пропустить. –

ответ

0

В нормальном случае ::

#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 < - это ваше имя пользователя.

0

У вас есть несколько способов доступа к окружающей среде:

  1. в качестве третьего параметра основного (int main(int argc, char **argv, char **envp);)
  2. через окружат глобальной переменной (char **environ;)
  3. через GetEnv (3) библиотека функция. Это делает поиск в среде только для строки формы "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. Комментарии приветствуются.

Смежные вопросы