2008-10-14 4 views
1

C++ 코드를 사용하여 루트 권한없이 실행중인 프로세스 (실행 파일)의 전체 경로를 가져오고 싶습니다. 누군가이를 달성 할 수있는 방법을 제안 할 수 있습니까?HPUX에서 실행중인 프로세스의 실행 파일의 전체 경로 얻기

Linux 플랫폼에서 다음과 같은 방법으로 사용할 수 있습니다.

char exepath[1024] = {0}; 
char procid[1024] = {0}; 
char exelink[1024] = {0}; 

sprintf(procid, "%u", getpid()); 

strcpy(exelink, "/proc/"); 
strcat(exelink, procid); 
strcat(exelink, "/exe"); 

readlink(exelink, exepath, sizeof(exepath)); 

여기 exepath는 실행 파일의 전체 경로를 제공합니다. 창문 마찬가지로

우리는 어떻게 HP-UX에는/proc 디렉토리 디렉토리가 없기 때문에 HP-UX에 그것을 수행하는 방법 도와주세요

GetModuleFileName(NULL, exepath, sizeof(exepath)); /* get fullpath of the service */ 

을 사용하여이 작업을 수행.

+0

"/ proc 디렉토리/% U/EXE ", getpid()); 코드에서 3 개의 버퍼와 4 개의 라인이 하나의 버퍼와 1 개의 라인으로 표시되어야합니다. –

답변

1

일반적인 경우 이전에이 작업을 수행했습니다. 일반적인 생각은 잡아 변수는 argv [0], 그리고 일부 처리를 할 수 있습니다 :

int main(int argc, char** argv) 
{ 
    string full_prog_path = argv[0]; 
    if (full_prog_path[0] == "/") 
    { // It was specified absolutely; no processing necessary. 
    } 
    else 
    { 
    string check_cwd = getcwd(); 
    check_cwd += argv[0]; 
    if (FileExists(check_cwd)) 
    { // It was specified relatively. 
     full_prog_path = check_cwd; 
    } 
    else 
    { // Check through the path to find it 
     string path = getenv("PATH"); 
     list<string> paths = path.split(":"); 
     foreach(test_path, paths) 
     { 
     if (FileExists(test_path + argv[0])) 
     { // We found the first path entry with the program 
      full_prog_path = test_path + argv[0]; 
      break; 
     } 
     } 
    } 
    } 

    cout << "Program path: " << full_prog_path << endl; 

    return 0; 
} 

는 물론, 이것은 어떤 점에서 깰 수있는 몇 가지 가정을 가지고 있지만, 대부분의 경우에 작동합니다.

+1

간단한 경우에는 괜찮습니다. 그러나, 그것은 신뢰할 수 없습니다. 나는 다음과 같이 쓸 수있다 : execl ("/ path/to/your/program", "../../penguins/rule/the/world", "arg1", (char *) 0); argv [0]의 값은 실행 파일의 이름과 닮지 않습니다. –

+0

@Jonathan : 내가 말한 것처럼, 그것은 몇 가지 가정을 가지고 있지만 대부분의 경우에 효과적입니다. 코드에서 언급 한 시나리오를 처리하는 방법을 모르겠습니다. –

1

유닉스 프로그래밍 FAQ에 대한 이전 답변이 옳았습니다. 문제는 Linux/proc 응답에서도 exec() 이후로 실행 파일의 경로가 변경되었을 수 있다는 것입니다. 사실, 실행 파일이 삭제되었을 수 있습니다. 더 복잡한 것은 링크 (기호 적 및 하드 모두)를 고려하여 발생합니다. 동일한 실행 파일에 여러 경로가있을 수 있습니다. 경로가 남아 있지 않을 수도 있고 고유하지 않을 수도 있기 때문에 모든 사례를 다루는 일반적인 대답은 없습니다.

즉, 이전에 cjhuitt에 의해 옹호 된 argv [0]을 사용하면 99.9 %의 시간을 원할 것입니다. 상대 경로 검사를하기 전에 "/"가 포함 된 경로에 대한 검사를 추가합니다 (그리고 cwd() 호출 전에 반드시 수행해야 함). 콜링 프로그램이 장난 스럽다면, fork()와 exec() 사이에 할 수있는 일들이 있습니다. 응용 프로그램 보안 (구성 파일의 위치와 같은)에 영향을 줄 수있는 모든 것에 대해서는이 정보에 의존하지 마십시오.

1

어떤 목적으로 실행 경로가 필요합니까? 이전 포스트에서 언급했듯이, 실행 파일에 대한 경로가 존재하거나 그것이 유일 할 것이라는 보장이 없다는 것을 명심하십시오.

9

먼저 리눅스 솔루션에 대해 말씀 드리고 싶습니다. 필요로하는 시간의 약 5 배이며 완전히 불필요한 작업을 많이 수행하며 1024 개의 매직 넘버를 사용합니다 잘못된 :

#include <limits.h> 
... 
    char exepath[PATH_MAX] = {0}; 
    readlink("/proc/self/exe", exepath, sizeof(exepath)); 

둘째, HP-UX에 대한 모든로드 된 모듈에 대한 정보를 얻을 수 shl_get_r()를 사용할 수 있습니다 여기에

$ grep PATH_MAX /usr/include/linux/limits.h 
#define PATH_MAX  4096 /* # chars in a path name */ 

는 올바른 최소한의 교체입니다. 인덱스 0에서 주요 실행 파일에 대한 정보를 찾을 수 있습니다. desc.filename은 실행 파일의 이름을 execve(2) 시간으로 가리 킵니다.

불행히도 그 이름은 상대적이므로 $PATH을 검색해야 할 수 있으며 응용 프로그램이 putenv("PATH=some:new:path") 일 경우 또는 원래의 exename이. ./a.out이고 응용 프로그램이 이후 chdir(2)을 수행했습니다.

HP-UX를 사용 PSTAT에
+1

사람이 "readlink()가 buf에 null 바이트를 추가하지 않는다는 것을 나타냅니다. 버퍼가 너무 작아 모든 내용을 담을 수 없으면 내용을 (bufsiz 문자 길이로) 자릅니다." – rpg

4

:

세계에서 당신이? 현재 snprintf (exelink, sizeof 연산자 (exelink)와 같은 문자열을 생성하지 왜
 
#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 
#include <unistd.h> 

#define _PSTAT64 
#include <sys/pstat.h> 

int main(int argc, char *argv[]) 
{ 
    char filename[PATH_MAX]; 
    struct pst_status s; 

    if (pstat_getproc(&s,sizeof(s),0,getpid()) == -1) { 
    perror("pstat_getproc"); 
    return EXIT_FAILURE; 
    } 

    if (pstat_getpathname(filename,sizeof(filename),&s.pst_fid_text) == -1) { 
    perror("pstat_getpathname"); 
    return EXIT_FAILURE; 
    } 

    printf("filename: %s\n",filename); 

    return EXIT_SUCCESS; 
} 
+1

HP에서이 예를 들어, 첫째, 다음 PSTAT 다시 떨어지는 표준 접근 방식을 결합 : http://h21007.www2.hp.com/portal/site/dspp/menuitem.863c3e4cbcdc3f3515b49c108973a801?ciid=88086d6e1de021106d6e1de02110275d6e10RCRD – pixelbeat

관련 문제