2014-12-11 3 views
0

작동하지 않음) (포크 NOT 필요 "기능 구축", 그것은 포크 수()와() execvp는 부르지 만, 나는 최근에 추가. 여기 학생 쉘 - CD가 나는 간단한 리눅스 쉘에서 일하고 있어요

는 실행 처리입니다 :

if (strcmp(cmd, "exit") == 0) { 
     exit = 1; 
    } 
    else if (builtIn(opt) == 0){ 
     execvp(cmd, opt); 
    } 
    else { 
     pid_t pID = fork(); 

     if (pID == 0) { 
      execvp(cmd, opt); 
     } else if (pID < 0) { 
      printf("\nFailed to fork\n"); 
     } else { 
      wait(0); 
     } 
    } 

내장() 단지 명령을 확인하고 반환 1 또는 0 :

int builtIn(char * opt[]) { 

    if (strcmp(opt[0], "cd")) { 
     return 1; 
    } 
    return 0; 
} 
+0

왜 출구 검사 cmd' '에서 찾고있다? 'opt [0]'이 아닌'cd'에 대해서'cmd'를 검사해야 할 것 같습니다. – Unn

+0

귀하의 질문은 무엇입니까? 코드가 정확히 무엇이며 어떻게 예상과 다른가? 죄송 –

+0

, 내 코드가 엉망이다, cmd를 내가 명령이 execvp는 전달 된 옵션 배열()의 첫 번째 요소로 저장됩니다 모르는 경우에서 남은입니다. 명령은 작동하지만 (ls, cal 등), cd가 아닙니다. cd는 아무 것도하지 않으며, 나는이 문제를 해결할 포기하지 않기를 바랬다. – Will

답변

2

그것은 당신이 분기 방지하기 위해 필요한 것은 사실이지만, 당신은 또한 필요 실행을 피하기 위해. 프로그램이 디렉토리를 변경하기 위해 호출하는 파일은 /bin/cd입니다.

대신에 뭔가를 실행, 경로와 chdir 시스템 호출을 호출합니다. 사용자 유형 cd /tmp 경우, 프로그램 로, chdir("/tmp")

현재 디렉토리가 (열린 파일이나의 umask 값으로) 각 프로세스재산 당신은 당신의 현재 디렉토리를 변경하는 프로그램을 호출 할 수 없습니다입니다 전화 다른 프로세스 인이고 실제로 귀하의 디렉토리가 아닌 해당 디렉토리가 변경됩니다. 이것이 cd 외부 명령이 없으며이를 변경하기 위해 시스템 호출을해야하는 이유입니다. (가) [0]`옵트`보고 확인에 내장 동안

+0

I 그것이라도 기술적 경우 ([CHDIR (2) (http://man7.org/linux/man-pages/man2/chdir.2.html) A * 시스템 호출 * 아니라 라이브러리 함수를 호출하는 것 –

+0

감사) 시스템 콜에 얇은 래퍼, 나는 교수를 물어 CHDIR 추가하기 너무 열심히하지 않는 것 같습니다. 감사! – Will