실행되는 파일의 위치 알아내기

hivaless의 이미지

실행되는 파일의 위치를 알아내고 싶은데, 적당한 방법이 떠오르지 않네요.
예를 들어서, /xxx/bin 이라는 폴더에, test 라는 실행 파일을
제가 만들어서 넣어 두었습니다.
/xxx/bin 은 PATH 에 넣어두어서, test 라는 실행파일은
어느 곳에서나 실행될 수 있습니다.
그런데, 제가 작성한 이 test 프로그램 안에서 자기가 위치하는 path 가 어디인지를 알고 싶은데, 어떻게 하는지 모르겠습니다.
위와 같은 경우라면, /xxx/bin 이라는 폴더를 구해야내야 겠지요.
물론 test 파일은 어느 경로에나 위치할 수 있구요. 그때마다, test 프로그램 내에서 자신의 위치를 알 수 있는 방법을 알고 싶습니다. 어떤 방법이 있을까요??

익명 사용자의 이미지

man getcwd()

lovian의 이미지

where 명령을 사용해보시지요?

-----------------
한글을 사랑합니다.

peccavi의 이미지

질문하신 내용이 이게 정확히 맞는지는 모르겠지만.. ^^;

자신의 실행 커맨드 정보를 /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...

hivaless의 이미지

getcwd 는 현재 디렉토리를 알아내는 함수 입니다.
제가 위에서 뜻하는 것과는 다른 용도로 쓰이는 함수죠.
예를 들어서,
/xxx/bin 폴더 밑에, test 라는 실행 파일이 있고
export PATH=/xxx/bin
으로 PATH를 설정하고
/xxx 에서 test 를 실행하면, /xxx/bin/test 파일이 실행이 됩니다.
하지만 test 프로그램 내에서 getcwd를 호출하여 값을 얻어내면,
현재 test를 실행한 위치인 /xxx 가 반환되죠.
제가 원하는 test 파일이 있는 /xxx/bin 이 반환되는 것이 아니구요...

hivaless의 이미지

peccavi 님 답변 감사드립니다.
제가 정확히 알고싶은 내용이군요. 감사드립니다 ^^
그런데, 리눅스에서 확인해 본 결과 정말 그런데, AIX 나 솔라리스 같은
다른 유닉스 운영체제에서도 위와 같은 구조를 갖는지 궁금하네요..
혹시 알고 계시는지....

lovian 님, man where -> where 명령어를 찾을 수 없다고 나오는데, where 명령어가 어디에 선언되어 있죠...

hivaless의 이미지

흠.. AIX 에서 확인해 본 결과, cwd 파일이 있긴 하지만 이 파일에서 readlink 로 읽는 것은 getcwd 와 같은 결과이고.. exe 파일이 없어서, 실행 파일의 위치를 알아낼 수 없더군요... 흠... AIX 에서는 방법이 없는 것입니까.....

peccavi의 이미지

앗.. 솔라리스나 AIX에서는 잘 모르겠습니다.

다른분들 답변좀 부탁드립니다~ 저도 궁굼하네요..

----
jai guru deva om...

kmhh0021의 이미지

hivaless wrote:
peccavi 님 답변 감사드립니다.
제가 정확히 알고싶은 내용이군요. 감사드립니다 ^^
그런데, 리눅스에서 확인해 본 결과 정말 그런데, AIX 나 솔라리스 같은
다른 유닉스 운영체제에서도 위와 같은 구조를 갖는지 궁금하네요..
혹시 알고 계시는지....

lovian 님, man where -> where 명령어를 찾을 수 없다고 나오는데, where 명령어가 어디에 선언되어 있죠...


whereis 입니다.


-------------------------------------------
피바다=피받아
http://blood.egloos.com
[一笑一少 一怒一老]
[笑門萬福來]

익명 사용자의 이미지

markboy 님이 올려주신 링크에 정확하게 제가 질문한 내용이 올라와 있네요..
질문한 사람도 저랑 상황이 똑같네요.. ㅎㅎ
링크된 글을 읽어보니, 결론은 unix 시스템에서는 없다네요...
흠.. filesystem 까지 나오면서 설명이 나오지만, 정확하게 이해할 수 있었던것 "알아낼 수 없다" 였습니다. ㅎㅎ
물론 방법이 있긴 했지만, 방법이 너무 어렵더군요..
흠.. 좀 쉬운 방법으로는 getenv(PATH) 함수를 이용해서,
path 안에서 실행파일을 찾아보는 방법 정도밖에...

ohhara의 이미지

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

ohhara의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.