는 쉘이 내장되어 있으므로 system()
을 사용하여 실행할 수 있습니다.exec() 패밀리를 사용하여 "cd"명령을 실행하십시오.
과 같이 exec()
패밀리가 cd
명령을 실행할 수 있습니까?
편집 : 그리고 방금 system("cd")
도 의미가 없다고 나타났습니다. 모두의 도움에 감사드립니다.
는 쉘이 내장되어 있으므로 system()
을 사용하여 실행할 수 있습니다.exec() 패밀리를 사용하여 "cd"명령을 실행하십시오.
과 같이 exec()
패밀리가 cd
명령을 실행할 수 있습니까?
편집 : 그리고 방금 system("cd")
도 의미가 없다고 나타났습니다. 모두의 도움에 감사드립니다.
exec
는 실행 파일을로드하고 그것으로 현재 프로그램의 이미지를 대체합니다. 올바르게 말씀 드렸듯이 cd
은 이 아니고 실행 파일이지만 쉘 내장입니다. 따라서 실행하고자하는 실행 파일은 쉘 자체입니다. 이 당신을 위해 무엇을 system()
물론입니다,하지만 당신은 그것에 대해 명시 할 경우, 당신은 exec
사용할 수 있습니다 오프 보내고 fork()
후
execl("/bin/sh", "-c", "cd", (const char *)0);
이 이후이 현재 프로세스 이미지, 이렇게해야 대체 새로운 과정.
그러나이 전체 절차는 아무런 효과가 없습니다. 현재 프로세스의 디렉토리를 변경하려면 chdir()
을 사용하십시오.
아니요, 사용하지 않을 것입니다. chdir
(프로세스의 현재 디렉토리를 변경하는 함수)은 프로세스를 호출하는 프로세스 (및 하위 프로세스)에만 영향을줍니다. 그것은 특히 부모에게 영향을 미치지 않습니다.
그래서 에는 아무런 의미가 없습니다. 디렉토리를 변경 한 직후에 프로세스가 종료되기 때문입니다.
은 (당신이 정말로 원하는 경우가 bash -c cd /tmp
같은 것을 간부 인 수 있지만, 내가 말했듯이,이 효과가없는 것입니다.)
이미 언급했듯이 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의 경우입니다.
'cd' 실행 파일은 독립적이며 불가능합니다. – glglgl
내가 사용하는 OS에 분명히 하나가 있습니다. – jlliagre
@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
포크가 완료되면 환경 변수 CWD (현재 작업 디렉토리)가 부모로부터 자식에 의해 상속됩니다.fork와 exec가 평소와 같이 끝나면 자식은 chdir()을 호출하여 디렉터리를 새 디렉터리로 변경하고 종료하지만 부모에게는 영향을주지 않습니다. 새로운 환경은 손실됩니다.
인수가 나타내는 내용을 살펴볼 수 있습니까? – User
@ 사용자 : 인수는 실행중인 명령을 구성합니다.이 인수는 가변 인수 함수이므로 인수의 끝을 어떻게 든 신호로 보내야합니다.이 경우 인수는'const char *'. 따라서 실행 된 명령은 :/bin/sh -c cd' –