2012-05-29 4 views
3

모의 쉘 프로그램을 설계하고 있는데 "cd"명령을 모방 할 수 없습니다. chdir()을 시도했지만 작동하지 않아 환경 변수 "PWD ="를 변경하려고했습니다.C++ 사용자 입력에서 작업 디렉토리 변경

여기에 제가 가지고있는 것이 있습니다. (내가 틀렸다 또는 가까운 CHDIR에 있다면, 정정 해줘 제발())

else if (command == "cd") 
     { 
      string pathEnv = "PWD="; 
      string newDir; 
      cin >> newDir; 
      pathEnv+=newDir; 
      cout << pathEnv << endl; 
      putenv(pathEnv.c_str()); 
     } 

희망이 명령은 'CD/사용자/사용자 이름/폴더'가 될 것입니다 내 pathEnv 변수가 될 것 "PWD =/user/username/folder "디렉토리를 바꿀 수 있습니까?

어떤 통찰력이라도 대단히 감사합니다.

+0

프로세스의 현재 디렉토리를 변경하는 작업은'chdir()'시스템 호출로 수행됩니다. 환경 변수를 변경해도 환경 변수를 변경하는 것 외에는 다른 작업을 수행하지 않습니다. 'chdir()'에 어떤 문제가 있습니까? –

+0

와우, $ PWD를 바꾸는 것이 좋습니다.^_ ^, chdir(), 그리고 언젠가는 OS 시스템 API의 기초에 대해서 쓰고 있습니다 – zinking

+0

'chdir()'이 얼마나 구체적으로 작동하지 않았습니까? – HighCommander4

답변

5

chdir() 당신이 찾고있는 명령이어야합니다. 현재 작업 디렉토리를 설정 한 후 getcwd()을 사용하여 가져 왔습니까?


다음은 나를 위해 작동 한 코드입니다.

char *getcwd(char *buf, size_t size); 
char *getwd(char *buf); 
char *get_current_dir_name(void); 

사용에 대한 자세한 내용은 유닉스에서 매뉴얼 페이지를 참조하십시오 :

#include <iostream> 
#include <string> 
#include <sys/param.h> 
#include <unistd.h> 

...

if (command == "curr") { 
    char buffer[MAXPATHLEN]; 
    char *path = getcwd(buffer, MAXPATHLEN); 
    if (!path) { 
     // TODO: handle error. use errno to determine problem 
    } else { 
     string CurrentPath; 
     CurrentPath = path; 
     cout << CurrentPath << endl; 
    } 
} else if (command == "cd") { 
    string newDir; 
    cin >> newDir; 
    int rc = chdir(newDir.c_str()); 
    if (rc < 0) { 
     // TODO: handle error. use errno to determine problem 
    } 
} 

은에 getcwd의 세 가지 버전()이 있습니다.

+0

는 여기에 내가 편집 한 내용은 다음과 같습니다 다른 경우 (명령 == "CURR") \t \t \t { \t \t \t \t를 size_t 크기; \t \t \t \t 문자열 CurrentPath; \t \t \t \t char * path = new char [1024]; \t \t \t \t 경로 = getcwd (경로, 크기); \t \t \t \t CurrentPath = path; \t \t \t \t cout << CurrentPath << endl; 다른 \t \t \t} 경우 (명령 == "CD") \t \t \t { \t \t \t \t 문자열 NEWDIR; \t \t \t \t cin >> newDir; \t \t \t \t chdir (newDir.c_str()); \t \t \t 세그 폴트, 생각? – twsmale

+0

@ThomasSmale :'curr' 경우'size'를 초기화하지 않습니다. 'path' 버퍼의 크기를'getcwd()'에 전달해야합니다. 또한,'delete path'를 잊어 버리거나 버퍼를 스코프의 끝보다 오래 존재할 필요가 없기 때문에'char path [1024]'지역 변수로 할당하십시오. –

+0

예를 들어 답을 업데이트했습니다. –