2012-03-25 3 views

답변

10

exec실행 파일을로드하고 그것으로 현재 프로그램의 이미지를 대체합니다. 올바르게 말씀 드렸듯이 cd이 아니고 실행 파일이지만 쉘 내장입니다. 따라서 실행하고자하는 실행 파일은 쉘 자체입니다. 이 당신을 위해 무엇을 system() 물론입니다,하지만 당신은 그것에 대해 명시 할 경우, 당신은 exec 사용할 수 있습니다 오프 보내고 fork()

execl("/bin/sh", "-c", "cd", (const char *)0); 

이후이 현재 프로세스 이미지, 이렇게해야 대체 새로운 과정.

그러나이 전체 절차는 아무런 효과가 없습니다. 현재 프로세스의 디렉토리를 변경하려면 chdir()을 사용하십시오.

+0

인수가 나타내는 내용을 살펴볼 수 있습니까? – User

+0

@ 사용자 : 인수는 실행중인 명령을 구성합니다.이 인수는 가변 인수 함수이므로 인수의 끝을 어떻게 든 신호로 보내야합니다.이 경우 인수는'const char *'. 따라서 실행 된 명령은 :/bin/sh -c cd' –

10

unistd.h에있는 int chdir(const char *path);을 사용하는 것이 더 낫습니다.

+0

+1 필요한 기능. – glglgl

2

아니요, 사용하지 않을 것입니다. chdir (프로세스의 현재 디렉토리를 변경하는 함수)은 프로세스를 호출하는 프로세스 (및 하위 프로세스)에만 영향을줍니다. 그것은 특히 부모에게 영향을 미치지 않습니다.

그래서 에는 아무런 의미가 없습니다. 디렉토리를 변경 한 직후에 프로세스가 종료되기 때문입니다.

은 (당신이 정말로 원하는 경우가 bash -c cd /tmp 같은 것을 간부 인 수 있지만, 내가 말했듯이,이 효과가없는 것입니다.)

3

이미 언급했듯이 system("cd xxx")은 응용 프로그램의 현재 디렉토리를 변경하지 않지만 완전히 쓸모가있는 것은 아닙니다.

시스템 종료 상태를 사용하여 현재 디렉토리를 명시된대로 변경하면 성공할 수 있는지 여부를 알 수 있습니다.

마찬가지로, 복잡한 솔루션처럼, 당신은 또한, 하나 독립적 인 cd 실행 파일을 제공하는 운영체제와 /bin/sh -c cd xxx하거나 /bin/cd xxx을 exec'ing와 포크/간부와 동일한 기능을 수행 할 수 있다면. 모든 POSIX 호환 운영체제 must 독립적 인 CD 실행 파일을 제공합니다

나는 그러나 access("xxx", X_OK|R_OK)

주 빠른 상당이 아닌 과잉을 추천 할 것입니다. 적어도 Solaris, AIX, HP-UX 및 Mac OS/X의 경우입니다.

+1

'cd' 실행 파일은 독립적이며 불가능합니다. – glglgl

+0

내가 사용하는 OS에 분명히 하나가 있습니다. – jlliagre

+0

@jliagre : 마지막 단락을 포인터로 백업하십시오. 예 : http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html의 끝 부분에 링크되어 있습니다. 정규 내장 [...]을 포함한 * 모든 표준 유틸리티는 다음과 같아야합니다. exec 함수 패밀리 *를 ​​통해 액세스 할 수있는 방식으로 구현됩니다. 그리고 솔라리스의 cd man http://docs.oracle.com/cd/E19253-01/816-5165/6mbb0m9bl/index.html에서 */usr/bin/cd는 호출하는 프로세스에는 아무런 영향을주지 않지만 사용할 수 있습니다. 주어진 디렉터리를 현재 디렉터리로 설정할 수 있는지 여부를 결정합니다. * – adl

0

포크가 완료되면 환경 변수 CWD (현재 작업 디렉토리)가 부모로부터 자식에 의해 상속됩니다.fork와 exec가 평소와 같이 끝나면 자식은 chdir()을 호출하여 디렉터리를 새 디렉터리로 변경하고 종료하지만 부모에게는 영향을주지 않습니다. 새로운 환경은 손실됩니다.

관련 문제