unix中的seek函数

unix中的seek函数

我试着去理解查找(2) 函数从 Unix 版本 6 开始。

这个例子:

seek(0,0,2)

所以第一个参数是文件描述符。 0 将是标准输入。第二个参数是偏移量,为 0。第三个参数根据手册页告诉我们“指针设置为文件的大小加上偏移量。

但你为什么要这样做呢?为什么你会指向文件后面?

该线路是从源代码

答案1

seek(0, 0, 2)跳过文件描述符 0 缓冲的所有数据。因此,在此命令之后,从该文件描述符进行的下一次读取将不是读取缓冲的任何内容。

我认为,如果您检查代码并了解实际目的是什么,您就会明白,即使文件描述符 0 通常是 stdin,但该程序实际上仅在它是通过该文件描述符读取的脚本的一部分时才有用。

例如,看一下以下脚本:

goto
echo "hello"

没有goto任何参数的将触发查找。

seek(0, 0, 2)如果命令退出后没有goto,脚本仍然会运行该echo "hello"命令,因为命令的调用者goto只是从脚本中读取下一个命令。

答案2

由于错误情况,您可能希望在返回之前倒回标准输入。

if (argc<2 || ttyn(0)!='x') {
    write(1, "goto error\n", 11);
    seek(0, 0, 2);
    return;
}

答案3

seekfseek用于更改文件中的当前位置(文件描述符(seek)或文件指针(fseek))。在C语言中,我通常使用fseek。从文件末尾开始查找/fseek (SEEK_END) 的一些典型用法:

文件末尾的位置 =seek(f,0,2) or fseek(f,0,2)

计算文件大小 = fseek(f,0,2); size=ftell(f)

文件末尾的位置减 20 =fseek(f,-20,2)

有些“文件”无法倒带

答案4

由于偏移量为0,它不在文件之后,因此它指向文件末尾,通常用于向文件追加数据。

这是通过 stdin 完成的,以超越已写入但未读取的输入,将其称为缓冲区是不准确的,因为如果 stdin 是管道,则会读取它,直到无法进一步读取为止。
passwd 命令执行此操作是为了防止输入不属于密码本身的情况(例如重复按回车键),并防止与其交互的基本脚本编写。

相关内容