Доступна ли среда в Windows? - PullRequest
       20

Доступна ли среда в Windows?

0 голосов
/ 25 января 2019

Доступна ли переменная environ (начиная с POSIX) (хотя бы для чтения) в основных компиляторах Windows C?

Я знаю, что execve доступно в Windows: https://en.wikipedia.org/wiki/Exec_(system_call)

Но я не уверен, есть ли в наличии environ.

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Следующая программа напечатает переменные окружения.

#include <stdio.h>

int main(int argc, char *argv[], char *env[]){
    int e = 0;
    while (env[e] != NULL) {
        printf("%s\n", env[e++]);
    }
}
0 голосов
/ 25 января 2019

окружающая среда должна быть доступна, но устарела, и вы должны использовать более безопасные методы.

Вызовы execXX() доступны, но fork() нет, поэтому функции exec оказываются бесполезными..

Вы можете использовать CreateProcessA для получения аналогичного эффекта и иметь возможность правильно настраивать окружения и каналы.

Просто для того, чтобы признать озабоченность @eryksun: Вам нужно подумать, какиенабор символов, который вы используете, прежде чем использовать какой-либо API-файл Microsoft «A» (и другие O / S).Проще всего, если вы можете сделать весь свой код с помощью 16-битного Unicode, так как это базовый тип для NT, Windows 7, Windows 10. В Unix и Mac вы можете предположить, что utf-8 является 8-битным набором символовВыбор, но это еще не произошло для окон, и, конечно, "обратной совместимости".Если вы используете любой"unix-like" M / S API, вы уже должны принимать те же проектные решения, поэтому уже должны иметь ответ.

0 голосов
/ 25 января 2019

РЕДАКТИРОВАТЬ: я был не прав; похоже, что библиотека времени выполнения MSVC все-таки включает поддержку environ (хотя и устарела). Я оставлю свой предыдущий ответ ниже, если кто-то заинтересован в альтернативных методах.


Не то, чтобы я знал, но, если вы хотите получить доступ к переменным окружения в Windows, у вас есть несколько вариантов:

  1. Объявите main или wmain со следующей подписью:

    int (w)main(int argc, char/wchar_t *argv[], char/wchar_t *envp[])
    

    Это определено в Стандарте C как указатель на блок среды, если применимо:

    & секта; J.5.1

    В размещенной среде главная функция получает третий аргумент, char * envp [], который указывает на завершающий нулем массив указателей на char, каждый из которых указывает на строку который предоставляет информацию об окружающей среде для этого выполнения программы (5.1.2.2.1).

  2. Используйте функцию Windows API GetEnvironmentVariable(A|W), чтобы получить отдельную переменную среды, или GetEnvironmentStrings, чтобы получить весь массив среды.

  3. Стандартная функция C getenv.

...