Linux/쉘, 쉘 명령어 구현하기

[쉘 구현하기] cd 명령어 오류 수정

Study with Me! 2023. 8. 12. 13:40

 

[쉘 구현하기] cd 명령어 구현

작업 디렉토리를 변경하는 cd 명령어를 추가했다. 인자를 전달하면 해당 인자로 작업 디렉토리를 이동하고, 인자를 전달하지 않으면 홈 디렉토리로 이동한다. chdir() 함수는 프로세스 생성 시 부

seongmoahn.tistory.com

cd 명령어 사용 시 프로세스를 생성하는 명령어들이 동작하지 않는 오류가 생겼다.

cd 명령어 사용 시 현재 작업 디렉토리가 소스코드가 있는 위치가 아닐 경우 my_*.c 파일을 호출하는 코드들이 동작하지 않는 오류가 생겼다.

아마 execv() 함수를 호출할 때 첫 번째 인자로 전달한 경로가 현재 작업 디렉토리이기 때문인 것 같다.

else if (pid == 0) {
    execv(execName, argList);
    exit(0);
}

helpExec(), lsExec() 함수 호출 시 실행 파일의 상대 경로가 아닌 절대 경로를 전달하도록 수정했더니 해결됐다.

// SM_shell.c
#include "my_header.h"

void helpExec() {
    pid_t pid;
    char path[PATH_MAX] = "";
    strcat(path, codePath);
    strcat(path, execName);

    if ((pid = fork()) < 0) {
        fprintf(stderr, "fork error\n");
        exit(1);
    }
    else if (pid == 0) {
        execl(path, "help", (char *)0);
        exit(0);
    }
    else {
        pid = wait(NULL);
    }
}

void lsExec(char **argList) {
    pid_t pid;
    char path[PATH_MAX] = "";
    strcat(path, codePath);
    strcat(path, execName);

    if ((pid = fork()) < 0) {
        fprintf(stderr, "fork error\n");
        exit(1);
    }
    else if (pid == 0) {
        execv(path, argList);
        exit(0);
    }
    else {
        pid = wait(NULL);
    }
}
...

위 코드는 아래 이미지를 클릭해 깃허브에서도 확인할 수 있다.

깃허브 이미지 링크