学习Linux:用read()系统调用读取文件

 
1.内核为每个进程维护一个打开文件的列表,该表由一些叫做文件描述符(fds)的非角整数进行索引。列表中每项均包含一个打开文件的信息。

2.文件描述符由C言语的int类型表示。不使用fd_t这个特殊类型来表示。每个Linux进程有一个打开文件数的上限。文件描述符从0开始,直到比上限小1。默认上限是1024,最多可1048576。负数不合法,常用于返回错误。

3.每个进程至少打开三个文件描述符:0(标准输入),1(标准输出)和2(标准错误)。其对应的预处理宏:STDIN_FILENO,STDOUT_FILENO和STDERR_FILENO。

4.文件描述符不仅用于普通文件,也用于讯问设备文件、管道、目录以及快速用户空间锁、FIFOs和套接字。

5.打开文件open()系统调用。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *name, int flags);
int open(const char *name, int flags, mode_t mode);除非创建新文件,否则mode参数会被忽略。
flags参数:O_APPEND,O_ASYNC,O_CREAT,O_DIRECT,O_DIRECTORY,O_EXCL,O_LARGEFILE,O_NOCTTY,O_NOFOLLOW,O_NONBLOCK(非阻塞读),O_SYNC,O_TRUNC。
mode参数:
S_IRWXU,S_IRUSR,S_IWUSR,S_IXUSR,S_IRGRP,S_IWGRP,S_IXGRP,S_IRWXO,S_IROTH,S_IWOTH,S_IXOTH。

6.创建文件creat()函数
等同于open("name", O_WRONLY | O_CREAT | O_TRUNC, ***)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int creat(const char *name, mode_t mode);

7.read()系统调用
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t len);从fd指向的文件的当前偏移量至多读len个字节到buf中。成功返回写入buf的字节数。出错时则返回-1,并设置errno。
*调用返回一个等于len的值。结果和预期一致。
*调用返回一个大于〇小于len的值。一个信号打断了读取过程,或在读入len个字节前已达到EOF。
*调用返回0.这标志着EOF。没有可以读的数据。
*调用被阻塞,因为没有可以读取的数据。这在非阻塞模式下不会发生。
*调用返回-1,并且errno被设置为EINTR。这表示在读入字节之前收到了一个信号。可以重新进行调用。
*调用返回-1,并且errno被设置为EAGAIN。这表示读取会因没有可用的数据而阻塞,而读请求应该在之后重开。这只在非阻塞模式下发生。
*调用返回-1,并且errno被设置不同于EINTR(系统调用被中断)或EAGAIN(重试)的值。这表示某种更严重的错误。

8.用read()读入所有字节的例程
ssize_t ret;
while(len != 0 && (ret = read(fd, buf, len)) != 0)
{
if(ret == -1)
{
if(errno == EINTR)
continue;
perror("read");
break;
}
len -= ret;
buf += ret;
}这段代码处理了所有五种情况。

9.非阻塞读
文件在非阻塞模式下打开(open()中给定O_NONBLOCK)并且没有可读数据,read()调用会返回-1,且设置errno为EAGAIN而不是阻塞掉。在进行非阻塞I/O时,必须检查EAGAIN,否则将可能因数据缺失而导致严重的错误。

10.read()大小限制
size_t的最大值为SIZE_MAX;ssize_t的最大值为SSIZE_MAX。大部分linux系统上,SSIZE_MAX是LONG_MAX,在32位系统上即0x7fffffff。如果len比SSIZE_MAX是LONG_MAX大,read()调用的结果是未定义的。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值