LINUX.ORG.RU

readlink( «/proc/self/exe», ...

aho
()

Для полноты картины: QCoreApplication::applicationFilePath ().

panter_dsd ★★★★
()
Ответ на: комментарий от GArik

>argv[0] не подходит... не из мейна вызывать...

эм...

Jetty ★★★★★
() автор топика
Ответ на: комментарий от GArik

> realpath(argv[0], x)

А правильную директорию кто устанавливать будет?

anonymous
()

> argv[0] не подходит... не из мейна вызывать...

Что мешает вам сделать значение argv[0] доступным не из мейна?

anonymous
()
Ответ на: комментарий от anonymous

> Что мешает вам сделать значение argv[0] доступным не из мейна?

argv[0] не обязательно полный каноничный путь к исполняемому файлу, если пытаться привести его к абсолютному не из main() - можно получить уже левый путь, пока readlink + /proc это единственный вменяемый способ, он же используется и внутрях того же Qt

aho
()
Ответ на: комментарий от aho

> argv[0] не обязательно полный каноничный путь к исполняемому файлу, если пытаться привести его к абсолютному не из main()

Это все понятно, тем не менее проанализировав argv[0], текущую директорию и переменную окружения PATH, тоже можно получить путь к исполняемому файлу. Именно такой способ и используется внутрях того же Qt, если пофейлился способ readlink + /proc.

anonymous
()
Ответ на: комментарий от anonymous

Именно такой способ и используется внутрях того же Qt, если пофейлился способ readlink + /proc.

Это для BSD, что ли?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

> Это для BSD, что ли?

Анализ argv[0] используется для любой системы на которой определен макрос Q_OS_UNIX, за исключением linux'a.

В linux вначале делается попытка получить имя через /proc/pid/exe, если имя получить не удалось, то делается анализ argv[0]. Первый способ может пофейлиться, например, из-за удаления/переименования/перемещения исполняемого файла.

anonymous
()
Ответ на: комментарий от Eddy_Em

> Я просто не пойму, как может провалиться способ чтения симлинка на /proc/self/exe в линуксе?

Вы до конца пост дочитать не пробовали?

может пофейлиться, например, из-за удаления/переименования/перемещения исполняемого файла.

anonymous
()
Ответ на: комментарий от Jetty

> В винде я так понимаю это какие-то винапи ?

GetModuleFileName( NULL, ...

aho
()

Я делаю так:

void getSelfPath() {
    char path[PATH_MAX + 1] = { 0 };

#if defined(__linux__)

    ssize_t len = readlink("/proc/self/exe", path, PATH_MAX);
    path[len]   = 0;
    char* p = strrchr(path, '/');
    if(p) *(p + 1)  = 0;
    else path[0]    = 0;

    m_pathmain  = path;

#elif defined(__MACOSX__)

    CFBundleRef mainBundle  = CFBundleGetMainBundle();
    CFURLRef executable     = CFBundleCopyExecutableURL(mainBundle);
    CFStringRef string      = CFURLCopyFileSystemPath(executable, kCFURLPOSIXPathStyle);
    CFStringGetCString(string, path, PATH_MAX, kCFStringEncodingUTF8);
    CFRelease(string);
    CFRelease(executable);
    CFRelease(mainBundle);

    // go up two levels
    m_pathmain  = path;
    size_t i    = m_pathmain.find_last_of('/');
    m_pathmain.erase(i, m_pathmain.length() - i);
    i   = m_pathmain.find_last_of('/');
    m_pathmain.erase(i, m_pathmain.length() - i);
    m_pathmain  += "/Resources/";

#else
    
    GetModuleFileName(NULL, path, PATH_MAX);
    char* p = strrchr(path, '\\');
    if(p) *(p + 1)  = 0;
    else path[0]    = 0;
   
    m_pathmain  = path;

#endif
}
andreyu ★★★★★
()
Ответ на: комментарий от anonymous

может пофейлиться, например, из-за удаления/переименования/перемещения исполняемого файла.

Во время выполнения?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

/proc/self/cmdline по сути уже лежит в argv, но главное что в общем случае по cmdline нельзя узнать полный путь.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.