실행되는 파일의 위치 알아내기
글쓴이: hivaless / 작성시간: 수, 2006/01/18 - 3:38오후
실행되는 파일의 위치를 알아내고 싶은데, 적당한 방법이 떠오르지 않네요.
예를 들어서, /xxx/bin 이라는 폴더에, test 라는 실행 파일을
제가 만들어서 넣어 두었습니다.
/xxx/bin 은 PATH 에 넣어두어서, test 라는 실행파일은
어느 곳에서나 실행될 수 있습니다.
그런데, 제가 작성한 이 test 프로그램 안에서 자기가 위치하는 path 가 어디인지를 알고 싶은데, 어떻게 하는지 모르겠습니다.
위와 같은 경우라면, /xxx/bin 이라는 폴더를 구해야내야 겠지요.
물론 test 파일은 어느 경로에나 위치할 수 있구요. 그때마다, test 프로그램 내에서 자신의 위치를 알 수 있는 방법을 알고 싶습니다. 어떤 방법이 있을까요??
Forums:
man getcwd()
man getcwd()
where 명령을 사용해보시지요?
where 명령을 사용해보시지요?
-----------------
한글을 사랑합니다.
질문하신 내용이 이게 정확히 맞는지는 모르겠지만.. ^^;자신의
질문하신 내용이 이게 정확히 맞는지는 모르겠지만.. ^^;
자신의 실행 커맨드 정보를 /proc/self 디렉토리에서 참조할 수 있습니다.
/proc/self/cwd 는 프로그램이 실행되어진 디렉토리의 링크이구요
/proc/self/exe 는 프로그램 자체 링크 입니다.
예를 들어, top을 아무 디렉토리에서 실행시켜 놓고 top의 pid가 만약 9000이라면
ls -l
/proc/9000/cwd -> /usr/bin
/proc/9000/exe -> /usr/bin/top
이 정보를 readlink(2) 함수를 통해 문자열로 얻어올 수 있습니다.
----
jai guru deva om...
getcwd 는 현재 디렉토리를 알아내는 함수 입니다.제가 위에서 뜻
getcwd 는 현재 디렉토리를 알아내는 함수 입니다.
제가 위에서 뜻하는 것과는 다른 용도로 쓰이는 함수죠.
예를 들어서,
/xxx/bin 폴더 밑에, test 라는 실행 파일이 있고
export PATH=/xxx/bin
으로 PATH를 설정하고
/xxx 에서 test 를 실행하면, /xxx/bin/test 파일이 실행이 됩니다.
하지만 test 프로그램 내에서 getcwd를 호출하여 값을 얻어내면,
현재 test를 실행한 위치인 /xxx 가 반환되죠.
제가 원하는 test 파일이 있는 /xxx/bin 이 반환되는 것이 아니구요...
peccavi 님 답변 감사드립니다.제가 정확히 알고싶은 내용이군요.
peccavi 님 답변 감사드립니다.
제가 정확히 알고싶은 내용이군요. 감사드립니다 ^^
그런데, 리눅스에서 확인해 본 결과 정말 그런데, AIX 나 솔라리스 같은
다른 유닉스 운영체제에서도 위와 같은 구조를 갖는지 궁금하네요..
혹시 알고 계시는지....
lovian 님, man where -> where 명령어를 찾을 수 없다고 나오는데, where 명령어가 어디에 선언되어 있죠...
흠.. AIX 에서 확인해 본 결과, cwd 파일이 있긴 하지만 이 파일
흠.. AIX 에서 확인해 본 결과, cwd 파일이 있긴 하지만 이 파일에서 readlink 로 읽는 것은 getcwd 와 같은 결과이고.. exe 파일이 없어서, 실행 파일의 위치를 알아낼 수 없더군요... 흠... AIX 에서는 방법이 없는 것입니까.....
앗.. 솔라리스나 AIX에서는 잘 모르겠습니다.다른분들 답변좀 부
앗.. 솔라리스나 AIX에서는 잘 모르겠습니다.
다른분들 답변좀 부탁드립니다~ 저도 궁굼하네요..
----
jai guru deva om...
whereis 입니다.
whereis 입니다.
-------------------------------------------
피바다=피받아
http://blood.egloos.com
[一笑一少 一怒一老]
[笑門萬福來]
[url]http://groups.google.com/group/comp
http://groups.google.com/group/comp.os.linux.development.system/browse_frm/thread/5ad9af59b2a2aab1/31771b6e10496c79 :D
markboy 님이 올려주신 링크에 정확하게 제가 질문한 내용이 올라와
markboy 님이 올려주신 링크에 정확하게 제가 질문한 내용이 올라와 있네요..
질문한 사람도 저랑 상황이 똑같네요.. ㅎㅎ
링크된 글을 읽어보니, 결론은 unix 시스템에서는 없다네요...
흠.. filesystem 까지 나오면서 설명이 나오지만, 정확하게 이해할 수 있었던것 "알아낼 수 없다" 였습니다. ㅎㅎ
물론 방법이 있긴 했지만, 방법이 너무 어렵더군요..
흠.. 좀 쉬운 방법으로는 getenv(PATH) 함수를 이용해서,
path 안에서 실행파일을 찾아보는 방법 정도밖에...
platform마다 다릅니다.AIX를 많이 써보지 않아서 잘은 모
platform마다 다릅니다.
AIX를 많이 써보지 않아서 잘은 모르겠지만 man page를 web에서 보니까 loadquery를 가지고 L_GETINFO나 L_GETLIBPATH option을 줘서 적절히 묘기를 부려 주면 얻는 것이 가능할 듯 합니다. executable이 아니라 shared object의 path만 얻는 것이 가능하다면 적절한 dummy shared object를 만들어서 executable과 같은 디렉토리에 둔 다음에 loadquery를 사용하면 될 것으로 생각됩니다.
Taeho Oh ( ohhara@postech.edu ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Alticast Corp. http://www.alticast.com
solaris의 경우에는 man page를 보니까 dladdr를 가지고
solaris의 경우에는 man page를 보니까 dladdr를 가지고 적절히 묘기를 부리면 어렵지 않게 해결이 가능할 듯 합니다.
Taeho Oh ( ohhara@postech.edu ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Alticast Corp. http://www.alticast.com
댓글 달기