Как я получаю путь процесса в Unix / Linux

Если ваш файл parse_ini_file ($ file) или подпрограмма испускает файл .ini, проверьте, не указаны ли данные в файле ini. Неучетные данные вызовут эту ошибку. Ex; data1 = test вызовет ошибку, data1 = "test" не будет.

125
задан unwind 9 March 2009 в 09:20
поделиться

4 ответа

На Linux символьная ссылка /proc/<pid>/exe имеет путь исполняемого файла. Используйте команду readlink -f /proc/<pid>/exe для получения значения.

На AIX, этот файл не существует. Вы могли выдержать сравнение cksum <actual path to binary> и cksum /proc/<pid>/object/a.out.

168
ответ дан 24 November 2019 в 00:51
поделиться

В Linux каждый процесс имеет свою собственную папку в /proc. Таким образом, Вы могли использовать getpid(), чтобы получить pid рабочего процесса и затем присоединиться к нему с путем /proc для получения папки, Вам, надо надеяться, нужно.

Вот короткий пример в Python:

import os
print os.path.join('/proc', str(os.getpid()))

Вот пример в ANSI C также:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>


int
main(int argc, char **argv)
{
    pid_t pid = getpid();

    fprintf(stdout, "Path to current process: '/proc/%d/'\n", (int)pid);

    return EXIT_SUCCESS;
}

Компиляция это с:

gcc -Wall -Werror -g -ansi -pedantic process_path.c -oprocess_path 
4
ответ дан 24 November 2019 в 00:51
поделиться

Существует не, "гарантировал, что работал где угодно" метод.

Шаг 1 должен проверить argv [0], если бы программа была запущена ее полным путем, то это (обычно) имело бы полный путь. Если это было запущено относительным путем, то же содержит (хотя это требует получения текущего рабочего каталога, с помощью getcwd ().

Шаг 2, если ни одно из вышеупомянутого не содержит, должен получить название программы, затем получить название программы от argv [0], затем получить ПУТЬ пользователя от среды и пройти это, чтобы видеть, существует ли подходящий исполняемый двоичный файл с тем же именем.

Примечание, что argv [0] установлен процессом, что должностные лица программа, таким образом, это не на 100% надежно.

2
ответ дан 24 November 2019 в 00:51
поделиться

Немного поздно, но все ответы были характерны для Linux.

при необходимости также в Unix, тогда Вам нужно это:

char * getExecPath (char * path,size_t dest_len, char * argv0)
{
    char * baseName = NULL;
    char * systemPath = NULL;
    char * candidateDir = NULL;

    /* the easiest case: we are in linux */
    size_t buff_len;
    if (buff_len = readlink ("/proc/self/exe", path, dest_len - 1) != -1)
    {
        path [buff_len] = '\0';
        dirname (path);
        strcat  (path, "/");
        return path;
    }

    /* Ups... not in linux, no  guarantee */

    /* check if we have something like execve("foobar", NULL, NULL) */
    if (argv0 == NULL)
    {
        /* we surrender and give current path instead */
        if (getcwd (path, dest_len) == NULL) return NULL;
        strcat  (path, "/");
        return path;
    }


    /* argv[0] */
    /* if dest_len < PATH_MAX may cause buffer overflow */
    if ((realpath (argv0, path)) && (!access (path, F_OK)))
    {
        dirname (path);
        strcat  (path, "/");
        return path;
    }

    /* Current path */
    baseName = basename (argv0);
    if (getcwd (path, dest_len - strlen (baseName) - 1) == NULL)
        return NULL;

    strcat (path, "/");
    strcat (path, baseName);
    if (access (path, F_OK) == 0)
    {
        dirname (path);
        strcat  (path, "/");
        return path;
    }

    /* Try the PATH. */
    systemPath = getenv ("PATH");
    if (systemPath != NULL)
    {
        dest_len--;
        systemPath = strdup (systemPath);
        for (candidateDir = strtok (systemPath, ":"); candidateDir != NULL; candidateDir = strtok (NULL, ":"))
        {
            strncpy (path, candidateDir, dest_len);
            strncat (path, "/", dest_len);
            strncat (path, baseName, dest_len);

            if (access(path, F_OK) == 0)
            {
                free (systemPath);
                dirname (path);
                strcat  (path, "/");
                return path;
            }
        }
        free(systemPath);
        dest_len++;
    }

    /* again someone has use execve: we dont knowe the executable name; we surrender and give instead current path */
    if (getcwd (path, dest_len - 1) == NULL) return NULL;
    strcat  (path, "/");
    return path;
}

ОТРЕДАКТИРОВАННЫЙ: Исправил ошибку, сообщенную Mark lakata.

27
ответ дан 24 November 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: