Переменные окружения и получение имени исполняемого файла в Mac OS X

Рейтинг: 0Ответов: 1Опубликовано: 18.11.2014

При разработке под MAC OS X на языке С/С++ столкнулась с проблемой: как задать переменную окружения, если в Windows достаточно было прописать %APPDATA% или %HOMEPATH%, а в MAC OS такой номер не пройдёт. Допустим, хочу прописать через переменную окружения адрес:

/Users/user-name/Folder

Вот так не работает:

/~/Folder

И ещё вопрос. В Windows можно получить адрес текущего исполняемого файла с помощью GetModuleFileName(). Подскажите, пожалуйста, аналог этой функции в MAC OS, желательно с примером использования. Или, к примеру, есть ли такая функция, которая на вход принимает имя искомого файла, а возвращает его местоположение на компьютере, если таковой есть, или если их несколько, какой-нибудь массив или структуру с их местоположением.

Спасибо за внимание, надеюсь на вашу помощь!

Ответы

▲ 2Принят

Не совсем понятно, что вы имеете в виду под «заданием» переменной окружения. В Си/С++ можно использовать setenv() и getenv() — посмотрите, вдруг это то, что вам нужно.


Получить имя текущей программы (~ имя файла), можно, используя _NSGetExecutablePath(), через argv[0] (доступ к которому можно получить не только в main()) или при помощи proc_pidpath().

Пример использования связки _NSGetExecutablePath() + realpath():

// $ clang demo.c -o demo
#include <stdio.h>
#include <stdlib.h> // realpath()
#include <limits.h> // PATH_MAX
#include <mach-o/dyld.h> // _NSGetExecutablePath()

int main(void)
{
    char path[PATH_MAX];
    uint32_t size = sizeof(path);
    if (_NSGetExecutablePath(path, &size) != 0) {
        fprintf(stderr, "Buffer is too small to store the whole path string"
                        "needs %u bytes\n", size);
        return EXIT_FAILURE;
    } 
    // path => ./demo
    char *resolved = realpath(path, NULL);
    // resolved => /Users/anon/something/onemorelevel/demo
    fprintf(stdout, "Executable path: %s\n", resolved);

    return EXIT_SUCCESS;
}

P.S. Лучше бы вы всё же разбили этот вопрос на два.