linux eof的含义是什么

78次阅读
没有评论

共计 2307 个字符,预计需要花费 6 分钟才能阅读完成。

这篇文章主要介绍“linux eof 的含义是什么”,在日常操作中,相信很多人在 linux eof 的含义是什么问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux eof 的含义是什么”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

linux eof 一般指文件末尾;EOF 是一个计算机术语,为 End Of File 的缩写,在操作系统中表示资料源无更多的资料可读取,在 Linux 中,在新的一行的开头,按下“Ctrl+D”,就代表 EOF。

linux eof 是什么意思?

EOF 是一个计算机术语,为 End Of File 的缩写,在操作系统中表示资料源无更多的资料可读取。在 linux 下,一般指文件末尾。

怎么通过 EOF 来判断程序是否读取到了文件末尾?

Linux 系统一个非常重要的思想就是:一切皆文件。不管是标准输入,文件系统中的普通文本文件,还是网络流都可以看做是文件,都可以通过 read/write 函数进行读写操作。因此,不同的文件类型,判断是否读取到文件末尾的方式也就有所不同,下面就按照

普通文本文件

标准输入文件(stdin)

socket 流文件

这三类文件来介绍判断它们是否读取到文件末尾的方法。

普通文本文件

这里的普通文件指的是我们平时在通过文件管理器所能看到那些文本文件,它存在于 Linux 中的文件系统中,并且文件的大小是固定的。

对于这种文件,Linux 系统判断普通文本文件是否读取到文件末尾的方法是:read 函数会对所打开的文件维护一个读取指针,然后根据这个指针跟文件开始位置的指针值相减得到一个相对于文件开始位置的偏移字节数,最后通过这样一个偏移字节数和文件本身的大小进行一个比较,如果相对于文件开始位置的偏移字节数大于文件本身的大小,那么就返回一个 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 系统判断标准输入文件是否读取到文件末尾的方法是:设置一个特殊的输入标记来表示文件末尾,而在 Linux 系统中这个标记就是组合键 Ctrl+D,当系统捕获到这个组合键时,就让 r read 函数返回一个 EOF 常量,告知程序已经读取到标准文件的末尾了。

socket 流文件

socket 流文件和标准输入文件类似都是流式文件,并且它是从网络上进行数据读取,所以上面两种判断文件是否读取到末尾的方法都不适用于 socket 流文件。

那么客户端进程怎么判断服务端进程是否已经写完所有数据?

在 socket 流文件中,当客户端进程通过 read 函数读取远程服务端进程发送过来的数据时,使用的是阻塞 I / O 的方式进行读取的。只要客户端和服务端之间的连接没有断开,如果服务端没有向 socket 写入数据,那么客户端的读操作就会阻塞,直到服务端中写入了新的数据。

如果服务端进程关闭了 socket 连接,那么客户端会接收到服务端发送过来的一个 TCP 协议的 FIN 数据包,然后客户端进程中原本阻塞着等待接收服务端进程数据的 read 函数此时就会被唤醒,返回一个值 0。这跟我们前面提到两种文件读到文件末尾返回 EOF(值为 -1)的情况有点差别,所以在程序中从 socket 进行读取操作时,判断数据流结束的标志不是 -1 而是 0。

Linux 中,在新的一行的开头,按下 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);
}

到此,关于“linux eof 的含义是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-12发表,共计2307字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)