linux eof는 일반적으로 파일의 끝을 의미하며, EOF는 컴퓨터 용어로 End Of File의 약어입니다. Linux에서는 처음에 데이터 소스에 더 이상 읽을 데이터가 없다는 의미입니다. 새 줄의 경우 "Ctrl+D"를 눌러 EOF를 나타냅니다.
이 튜토리얼의 운영 환경: linux5.9.8 시스템, Dell G3 컴퓨터.
리눅스 eof는 무엇을 의미하나요?
EOF는 컴퓨터 용어로 End Of File의 약어입니다. 운영체제에서는 데이터 원본에 더 이상 읽을 데이터가 없음을 나타냅니다. Linux에서는 일반적으로 파일의 끝을 나타냅니다.
프로그램이 파일 끝까지 읽었는지 확인하기 위해 EOF를 사용하는 방법은 무엇입니까?
Linux 시스템에서 매우 중요한 아이디어는 모든 것이 파일이라는 것입니다. 표준 입력이든, 파일 시스템의 일반 텍스트 파일이든, 네트워크 스트림이든 파일로 간주할 수 있으며 읽기/쓰기 기능을 통해 읽고 쓸 수 있습니다. 따라서 파일 형식에 따라 파일 끝을 읽었는지 확인하는 방법이 다릅니다. 다음은
일반 텍스트 파일
표준 입력 파일(stdin)
소켓 스트림 파일
이 세 가지 유형의 파일은 파일 끝까지 읽었는지 여부를 확인하는 방법을 소개합니다.
일반 텍스트 파일
여기서 일반 파일은 우리가 일반적으로 파일 관리자를 통해 보는 텍스트 파일을 의미하며, 리눅스의 파일 시스템에 존재하며 파일 크기가 고정되어 있습니다.
이런 종류의 파일의 경우 Linux 시스템이 일반 텍스트 파일을 파일 끝까지 읽었는지 여부를 확인하는 방법은 다음과 같습니다. 읽기 함수는 열린 파일에 대한 읽기 포인터를 유지한 다음 포인터에서 이 포인터를 뺍니다. 파일 시작 부분의 오프셋 바이트를 가져오고 마지막으로 파일 시작 부분의 오프셋 바이트가 크기보다 큰 경우 오프셋 바이트를 비교합니다. 그런 다음 파일의 끝을 읽었음을 나타내는 EOF 상수가 반환됩니다.
따라서 위의 내용에 따르면 파일에 n 문자가 포함되어 있으면 while 루프의 내부 작업이 n+1 번 실행됩니다. 따라서 가장 안전한 작성 방법은 다음과 같습니다.
int c = fgetc(fp); while (c != EOF) { do something; c = fgetc(fp); } if (feof(fp)) { printf("\n End of file reached."); } else { printf("\n Something went wrong."); }
표준 입력 파일
표준 입력 파일(stdin) 주변 키보드 입력에 해당하며, 리눅스 시스템에서는 파일로 추상화되어 있는데, 정확히는 스트림 파일이라고 합니다. 이러한 종류의 파일은 위의 일반 텍스트 파일과 가장 큰 차이점은 파일 크기가 고정되어 있지 않으며 마치 수도관의 입구 끝과 같아서 언제든지 입력을 받을 수 있다는 것입니다.
위에서 언급한 파일 크기 비교 방법으로는 파일의 끝을 읽었는지 여부를 판단하는 것이 불가능하다는 것은 바로 표준 입력 파일의 스트리밍 특성 때문입니다. 따라서 Linux 시스템에서 표준 입력 파일을 파일 끝까지 읽었는지 확인하는 방법은 파일 끝을 나타내는 특수 입력 표시를 설정하는 것입니다. Linux 시스템에서 이 표시는 Ctrl+ 키 조합입니다. D. 시스템이 이 키 조합을 캡처할 때 r 읽기 함수가 EOF 상수를 반환하여 표준 파일 끝까지 읽었음을 프로그램에 알리도록 합니다.
소켓 스트림 파일
소켓 스트림 파일은 표준 입력 파일과 유사하며 네트워크에서 데이터를 읽으므로 파일을 끝까지 읽었는지 여부를 판단하는 위의 두 가지 방법은 소켓 스트림 파일에는 적용되지 않습니다.
그럼 클라이언트 프로세스는 서버 프로세스가 모든 데이터 쓰기를 완료했는지 어떻게 확인합니까?
소켓 스트림 파일에서 클라이언트 프로세스는 읽기 기능을 통해 원격 서버 프로세스가 보낸 데이터를 읽을 때 블로킹 I/O를 사용하여 읽습니다. 클라이언트와 서버 간의 연결이 끊어지지 않는 한, 서버가 소켓에 데이터를 쓰지 않으면 새 데이터가 서버에 기록될 때까지 클라이언트의 읽기 작업이 차단됩니다.
서버 프로세스가 소켓 연결을 닫으면 클라이언트는 서버로부터 전송된 TCP 프로토콜 FIN 패킷을 수신하게 되며, 서버 프로세스로부터 데이터 수신을 기다리며 원래 차단되었던 클라이언트 프로세스의 읽기 기능이 깨어나게 됩니다. 올라가서 0 값을 반환합니다. 앞서 언급한 두 종류의 파일이 파일의 끝을 읽은 후 EOF(값은 -1)를 반환하는 상황과는 조금 다릅니다. 따라서 프로그램에서 소켓에서 읽을 때 끝을 판단하는 플래그가 있습니다. 데이터 스트림의 값은 -1이 아니라 0입니다. .
리눅스에서는 새 줄 시작 부분에서 Ctrl-D를 누르면 EOF를 의미합니다(줄 중간에서 Ctrl-D를 누르면 "표준 입력" 버퍼 영역을 출력한다는 의미이므로 이 때 두 번 눌러야 합니다) 시간 Ctrl-D) Windows에서 Ctrl-Z는 EOF를 의미합니다. (그런데 Linux에서 Ctrl-Z를 누르면 프로세스가 중단되고 백그라운드에서 일시 중지됩니다. fg 명령을 사용하면 다시 포그라운드로 전환할 수 있습니다. Ctrl-C를 누르면 프로세스가 종료됩니다.)
那么,如果真的想输入Ctrl-D怎么办?这时必须先按下Ctrl-V,然后就可以输入Ctrl-D,系统就不会认为这是EOF信号。Ctrl-V表示按”字面含义”解读下一个输入,要是想按”字面含义”输入Ctrl-V,连续输入两次就行了。
所以,一个简单的从 socket 文件读取数据的样例代码,通常是下面这样的:
char recvline[MAX_LINE_LENGTH]; int read_count; while ((read_count = read(sock_fd, recvline, MAX_LINE_LENGTH)) > 0) { printf("%s\n", "String received from server: "); fputs(recvline, stdout); }
总结
所以,一定要记住这样一个概念:EOF 是一个常量而不是一个字符!。
推荐学习:《linux视频教程》
위 내용은 리눅스 eof는 무엇을 의미합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!