리눅스에서 EOF(Ctrl+D)에 대해서 자세한 설명좀 부탁드립니다

aubin의 이미지

int a;
a = getchar();
while(a != '\r' || a != EOF) {
a = getchar();
}

foo();

-----------------------------------

제가 대충 알기론 리눅스에서 Ctrl+D 하면 바로 EOF가 들어가서 while루프를 나가서 foo()를 실행할줄 알았지만

실제로는 Ctrl+D를 두번 보내야 foo()로 넘어가더군요

왜 그런지 자세하게 설명해주실분 안계신가요?

Ctrl+C는 그냥 프로세스 강제종료니까 한번만 입력하면 foo를 실행안하고 그 자리에서 종료되는건 알겠는데 Ctrl+D는 어떤 원리이길래 한번에 while을 못나가는지 궁금합니다

cinsk의 이미지

while(a != '\r' && a != EOF)