Linux ctrl+c 와 ctrl+d의 차이점

Jeheon Park·2021년 10월 9일
0

문제점

42서울 과정을 하다가 인풋을 받고 있는 루프안(대기가 없는 통신, 비동기화 통신)에서 ctrl+d를 눌러서 종료시켜야 하는데 어떻게 해야하냐는 동료의 질문을 받았다. ctrl+d는 eot라는 것을 알고 있었지만 그것의 완벽한 정의를 알수 없어서 정리하여 남기려고 합니다.

해결

우선 많이 사용하는 ctrl+c는 프론트 프로세스(전면 프로세스)를 종료하는 명령어이다. 간단하게 커널에 사용자 입력으로 인터럽트를 주어서 프로세스를 종료시킨다. 반면에 ctrl+d는 스탠다드 인풋의 종료를 알리는 것이다. 즉, 터미널의 인풋을 받고 있는 상태인 icanon mode가 아니면 ctrl+d가 먹히지 않는다. 프로세스에게 더이상의 인풋이 없다는것을 알려주는 ascii코드 4번의 인풋이다.

int x;
for (;;) {
    printf("\nHow many circles do you want to write? (to end the program click Ctrl+D at the same time!)\n");
    int res = scanf("%d", &x);
    if (res == EOF) break;
    if (res == 1) {
         ... // Draw x circles here
    } else {
        printf("Invalid input is ignored.\n");
        scanf("%*[^\n]");
    }
}
printf("\n\n Bye! \n\n");
return 0;

보통 이런식으로 사용하며 사용자가 직접 ctrl+d를 눌러주어서 입력한다.

출처

https://unix.stackexchange.com/questions/110240/why-does-ctrl-d-eof-exit-the-shell
https://stackoverflow.com/questions/30304368/end-while-loop-with-ctrld-scanf

profile
개발자

0개의 댓글