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