C программа: getenv возвращает NULL в GDB / DDD - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь вызвать getenv в моем C-коде, это может вернуть правильную строку env в терминал, в то время как в GDB / DDD он возвращает NULL.

void main() {
  char * a = getenv("ANCHOR_STEM");
  if (strlen(a)>0)
    printf("%s\n", a);
}

GDB / DDD запускается с того же терминала,Даже я "показываю среду", этот env существует.

Кто-нибудь есть идеи?

Информация о версии OS / Tools: RHEL Linux hostname1 2.6.32-754.3.5.el6.x86_64 # 1 SMPЧт, 9 августа 11:56:22 EDT 2018 x86_64 GNU / Linux GNU GDB (GDB) 7,12 GCC (GCC) 6,3,0

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Если getenv возвращает NULL, это потому, что он не находит переменную окружения.но все же вы должны быть осторожны.Эта инструкция if (strlen(a)>0) становится недопустимой, если getenv(....) не выполняется.getenv отправляет обратно NULL, и эта инструкция завершает работу программы.Лучше проверить правильность указателя , прежде чем выполнять эту строку if (strlen(a)>0) ->, что не обязательно полезно.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char * a = getenv("ANCHOR_STEM");
    if( NULL != a ){
        (void)puts(a);
        return EXIT_SUCCESS;
    }
    (void)puts("none");
    return EXIT_FAILURE;
}
0 голосов
/ 26 октября 2018

Даже если я "показываю окружающую среду", этот env существует.

Когда GDB вызывает вашу программу, он запускает новую оболочку для запуска этой программы.

Когда среда для целевой программы изменяется, чаще всего это результат изменения файла инициализации вашей оболочки (~/.bashrc, ~/.kshrc и т. Д.).

Это действительно плохая идея изменить среду для неинтерактивных оболочек. Документация о том, как этого избежать.

0 голосов
/ 26 октября 2018

включает правильные заголовочные файлы

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

Считать предупреждение ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...