리눅스 미니 쉘을 만들고 있습니다.

black928kr의 이미지

쉘 명령어를 받는 프롬프트 창을 만드는 중인데요

int main() {
char a;

while (1) {
printf("MyShell$");
a = getchar();
}
return 0;
}

이란 코드를 작성하고 컴파일 후 실행시키면

Myshell$ 이 출력된 이후 getchar()를 실행하는데,
문제는 여기서 문자를 아무 거나 치고 엔터를 누르면

Myshell$ Myshell$ 이렇게 두번 혹은 그이상 연달아 출력되고 또 getchar()를 수행합니다

저는 아무리 입력을 받아도 Myshell$ 은 한번만 출력되게 하고 싶은데 왜그런가요?

익명 사용자의 이미지

get character
가져와 글자를

익명 사용자의 이미지

> 여기서 문자를 아무 거나 치고 엔터를 누르면

그 아무거나 한번, 엔터키 한번, 그렇게 두개의 키가 입력되기때문입니다.
설명보다 코드를 보는것이, 이해가 빠를것입니다.

#include <stdio.h>
 
int main() {
    size_t MAX_BUF = 1024;
    char line_buf[MAX_BUF];
    char ch;
    int i;
 
    while (1) {
        printf("MyShell$ ");
        for (i=0; i < MAX_BUF; i++) {
            line_buf[i] = ch = getchar();
            if (ch == '\n' || ch == EOF) {
                break;
            }
        }
 
        if (i == MAX_BUF) {
            printf("Arguments too long.\n");
            continue;
        }
        else if (i == 0) {
            // 사용자가, Ctrl + D 를, 눌렀다면, 쉘 종료.
            if (line_buf[0] == EOF) {
                printf("\n");
                break;
            }
            // 그냥, 아무것도 입력안하고 엔터만 친 경우.
            continue;
        }
 
        // 읽어진, 라인을 실행한다.
        line_buf[i] = '\0';
        system(line_buf);
    }
 
    return 0;
}

위코드를, 컴파일해서 실행해보세요.

gcc shell.cpp -o my_shell
./my_shell
MyShell$ 123
MyShell$ ls
......
MyShell$ ls *
......
MyShell$ pwd
......
MyShell$ (Ctrl+D를 눌러보세요.)