linuxopen文件偏移

linuxopen文件偏移,第1张

通过函数lseek可以改变文件当前的读写位置

函数原型

#include <sys/types.h>

#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence)

参数属性:

offset:表示从文件的whence位置开始偏移的位置大小。

whence:表示文件偏移的位置

有三个选项:

SEEK_SET:表示从文件开始位置偏

SEEK_CUR:表示从文件当前的读写位置偏

SEEK_END:表示从文件的结束位置偏移seek.。

int main

//打开文件

int fd = open("b.bat",O_CREAT|O_RDWR)

if(fd == -1)

perror("错误:"),exit(-1)

//准备数据

char *str = "abcdefghigklmn"

//写入数据

write(fd,str,strlen(str))

//准备空间

char buf[32] = {0}

//将文件的读写位置移动到文件的开始

lseek(fd,0,SEEK_SET)

//读取5个字节的数据

read(fd,buf,5)

//输出

puts(buf)

//关闭文件

close(fd)

文件偏移量的移动时机:

1、lseek主动移动偏移量

2、read会移动偏移量

3、write会移动偏移量

进程 --》运行--》进程在内存中存在一个进程表项(文件表) //文件表在内核管理的内存空间中

文件最开始运行时,有三个“文件描述符”已经打开:0,1,2

当使用open函数打开一个文件的时候,系统就会创建一个文件表

文件表的内容:

1、文件状态标志:O_RDONLY \O_WRONLY...

2、文件偏移量(刚打开的文件偏移量为0)

3、V节点指针:指向“v节点表” //V节点表(磁盘的文件系统上):V节点信息、I节点信息、文件大小

sendfile - transfer data between file descriptors

sendfile() 在一个文件描述符和另一个文件描述符之间复制数据。 因为这种复制是在 内核中完成 的,所以 sendfile() 比 read(2) 和 write(2) 的组合更有效,后者需要将数据传入和传出用户空间。

in_fd 是一个为读取而打开的文件描述符, out_fd 是一个为写入而打开的描述符。

如果 offset 不为NULL,则sendfile()将以其为偏移量从 in_fd 中读取数据。当 sendfile() 返回时,此变量将设置为读取的最后一个字节之后的偏移量。 如果 offset 为 NULL,则将从 in_fd 中的文件偏移量开始读取数据。

需要注意!如果指定了 offset ,那么读取 in_fd 中的数据是不会修改其打开文件自身的偏移量的。

count 是要在文件描述符之间复制的字节数。

in_fd 参数必须是支持类似 mmap(2) 等 *** 作的文件(即它不能是套接字)。

在 2.6.33 之前的 Linux 内核中, out_fd 必须引用套接字。 从 Linux 2.6.33 开始,它可以是任何文件。 如果它是一个常规文件,则 sendfile() 适当地更改 out_fd 的文件偏移量。

如果传输成功,则返回写入 out_fd 的字节数。 请注意,成功调用 sendfile() 可能会写入比请求更少的字节; 如果有未发送的字节,调用者应该准备重试调用。 另见NOTES。

出错时,返回 -1,并设置 errno 以指示错误。

sendfile() 首次出现在 Linux 2.2 中。 从 glibc 2.1 开始就存在包含文件 <sys/sendfile.h>。

Not specified in POSIX.1-2001, nor in other standards.

Other UNIX systems implement sendfile() with different semantics and prototypes. It should not be used in portable programs.

sendfile() 最多传输 0x7ffff000 (2,147,479,552) 个字节,返回的是实际传输的字节数。 (在 32 位和 64 位系统上都是如此。)

如果您计划使用 sendfile() 将文件发送到 TCP 套接字,但需要在文件内容之前发送一些标头数据,您会发现使用 TCP_CORK 选项很有用,在 tcp(7) 中描述,以最小化 数据包的数量并调整性能。

根据tcp(7),TCP_CORK的作用是:如果设置,则不发送部分帧。 当再次清除该选项时,将发送所有排队的部分帧。更方便的,可以在执行时send()时设置MSG_MORE标志,见 send(2)

在 Linux 2.4 及更早版本中,out_fd 也可以指普通文件; 这种可能性在 Linux 2.6.x 内核系列中消失了,但在 Linux 2.6.33 中恢复了。

最初的 Linux sendfile() 系统调用不是为了处理大文件偏移量而设计的。 因此,Linux 2.4 添加了 sendfile64(),偏移参数的类型更宽。 glibc sendfile() 包装函数透明地处理内核差异。

在 sendfile() 因 EINVAL 或 ENOSYS 失败的情况下,应用程序可以回退到 read(2)/write(2)。

如果 out_fd 引用了具有零拷贝支持的套接字或管道,则调用者必须确保 in_fd 引用的文件的传输部分保持不变,直到 out_fd 另一端的读取器消耗了传输的数据。

Linux 特定的 splice(2) 调用支持在任意文件描述符之间传输数据,前提是其中一个(或两个)是管道。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11730795.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存