디렉토리 이동?

jelongdong2의 이미지

디렉토리 이동을 하는 코드를 짜고 싶은데...막상 어케 해야할지 모르겠습니다.
간단하게 시스템함수를 쓰면 될줄 알았는데...안되네요!^^;
ex) system( "cd /usr/share" );

정태영의 이미지

man chdir

워낙 쉬운 함수라 맨페이지만 보셔도

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

rhizome의 이미지

jelongdong2 wrote:
디렉토리 이동을 하는 코드를 짜고 싶은데...막상 어케 해야할지 모르겠습니다.
간단하게 시스템함수를 쓰면 될줄 알았는데...안되네요!^^;
ex) system( "cd /usr/share" );

#include <unistd.h>
...
chdir("/usr/share");
...

거짓말이 없다는 것은 현대성보다도 사상보다도
백배나 더 중요한 일이다.

jelongdong2의 이미지

답변 감사합니다.
혹시 시스템 함수 말고 명령어를 실행할수 있는 함수 혹은 다른 방법이 있나요?

mirr의 이미지

jelongdong2 wrote:
답변 감사합니다.
혹시 시스템 함수 말고 명령어를 실행할수 있는 함수 혹은 다른 방법이 있나요?

man execl

내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

pynoos의 이미지

execl 계열 함수 사용하기 전에 fork 먼저 :)

cinsk의 이미지

어떤 경우인지는 잘 모르겠지만, 큰 이유가 없다면, 프로그램의 현재 디렉토리를 바꾸는 것은 바람직하지 않습니다. 왜냐하면, 사용자의 입장에서 혼동스러울 수 있을 뿐만 아니라, 특정 디렉토리에 강제적으로 위치해서, mount/umount가 불가능할 수 있는 상황이 발생할 수 있기 때문입니다. 몇 가지 예외 사항을 들면:

첫째, 디렉토리를 돌아다니며(traverse) find(1)와 같이 여러 파일에 대해 작업이 필요한 경우. 이 경우 적절하게 chdir(2)을 써서 현재 디렉토리를 바꾸며 작업하다가, 작업이 끝나면 반드시 원래의 위치로 복원시켜 주는 것이 바람직합니다.

둘째, daemon 형태로 돌아가는 서버 프로그램인 경우. 가능하면 시작 위치에 상관없이 현재 디렉토리를 루트 (/)로 바꾸어서, 파일 시스템의 mount/umount를 순조롭게 해 줍니다.

다른 경우는 지금 생각나지 않는군요. 꼭 필요한 상황이 아닐 경우, 현재 디렉토리를 바꾸는 것은 좋지 않을 수 있으니, 주의하기 바랍니다.

또한 직접 만들어 쓸 것이 아니라면, 현재 디렉토리를 얻기 위해 GNU glibc extension인 get_current_dir_name()을 쓰는 것도 좋습니다.

exec* 함수를 쓸 것이라면, fork(2)와 vfork(2), child signal 등에 대해서도 알아 두시는 게 도움이 될 것 같습니다.

pynoos의 이미지

사족을 더 붙이자면, thread 프로그램에서는 process 전체에 영향을 미치는 일이 되므로 더욱 하지 않아야합니다.

mirr의 이미지

pynoos wrote:
execl 계열 함수 사용하기 전에 fork 먼저 :)

fork를 잊고있었군요 :roll:

내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

정태영의 이미지

jelongdong2 wrote:
디렉토리 이동을 하는 코드를 짜고 싶은데...막상 어케 해야할지 모르겠습니다.
간단하게 시스템함수를 쓰면 될줄 알았는데...안되네요!^^;
ex) system( "cd /usr/share" );

그런데 cd 라던가 pushd, popd 같은 명령어들은 쉘 내장 명령어 입니다...

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

jelongdong2의 이미지

Quote:
pid_t Pid = fork();

if ( Pid < 0 ) printf( "fork failed\n" );
if ( Pid == 0 )
{
execl( "/bin/rm", "rm", "-rf", "a.c", (char*)0 );
execl( "/bin/ls", "ls", "a.c", (char*)0 );
printf( "exec failed\n" );
}

이런식으로 2가지 명령어를 쓰려니까 안됩니다.
단지 rm 명령어만 먹습니다.
ls 명령어도 먹게할려면 어떻게 해야하나요!

pynoos의 이미지

부모 프로세스에서 다시 fork 해야지요.

작성했던 것을

strace -f ./prog

로 따라가보세요.

정태영의 이미지

      pid_t Pid = fork();

        if ( Pid < 0  ) printf( "fork failed\n" );
        if ( Pid == 0 )
        {
            execl( "/bin/rm", "rm", "-rf", "a.c", (char*)0 );
            printf( "exec failed\n" );
        }

        Pid = fork();

        if ( Pid < 0  ) printf( "fork failed\n" );
        if ( Pid == 0 )
        {
            execl( "/bin/ls", "ls", "a.c", (char*)0 );
            printf( "exec failed\n" );
        }

exec 를 한 순간 현재 프로세스는 새로 실행한 프로그램으로 바꿔치기 합니다.

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.