How do I get the path of a process in Unix / Linux

后端 未结 11 639
无人共我
无人共我 2020-12-02 04:31

In Windows environment there is an API to obtain the path which is running a process. Is there something similar in Unix / Linux?

Or is there some other way to do th

11条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-02 05:04

    A little bit late, but all the answers were specific to linux.

    If you need also unix, then you need this:

    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;
    }
    

    EDITED: Fixed the bug reported by Mark lakata.

提交回复
热议问题