Linux系统调用 - read

read()系统调用的原型:ssize_t read(int fd, void *buf, size_t count);

功能:从指定的文件描述符中读取最多count个字节的数据到指定的buf中去。如果传入的count是0,这个系统调用什么都不干,直接返回0。如果指定的count大于0,而且返回值也大于0,则表示函数执行成功,返回值表示成功读取的字节数,同时被读取的文件的当前数据指针会相应后移。如果返回值为0,表示遇到了文件结尾。如果读取失败,read()会返回-1,并设置errno。

但是有时候,返回-1并不一定表示文件坏了读不了了,比如:

如果在套接字上设置了O_NONBLOCK属性(非阻塞),而当前套接字上又没有数据可读,那么read()系统调用就会返回EAGAIN或者EWOULDBLOCK,表示暂时读不到东西,稍后再来试吧。

再比如,虽然当前套接字是阻塞模式的,但是设置了发送或接收超时时间,那么read()就会阻塞在套接字上等待数据过来,如果在超时时间内没有拿到任何数据,那么也会收到一个EAGAIN或者EWOULDBLOCK的errno,这时也应该稍后再来重新尝试读取。

另外还要注意,POSIX标准中并没有规定在上面两种情况下应该把errno设置为EAGAIN还是EWOULDBLOCK,实现中设置这两个错误代码都是可以的,所以一个程序要具有更好的适用范围,应该总是把这两个errno放在一起检查。

除此之外,还有一个errno,叫EINTR,表示在读取过程中,在读到数据之前被信号打断了,这时也应该当做正常情况处理,信号处理程序执行完成之后,只要程序还能再回来,就应该当没事一样继续正常的逻辑,重新读一次。

其他一些错误代码就要表示读取失败了,如EBADF,EFAULT,EINVAL,EIO等,具体就请参见帮助手册吧。

用read()系统调用读取本地磁盘设备上的文件时,通常可以认为读取速度是足够快的,因此通常不会设置O_NONBLOCK标志。在有些系统的实现上,设置会让非阻塞标志在处理本地磁盘文件是不生效。

 

==================== 以下是广告 ====================

更多系统详尽的Linux系统编程内容,欢迎订阅GitChat专栏 《攻克Linux系统编程》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux系统调用号是指操作系统提供给用户程序调用的接口函数的编号。每个系统调用都有一个唯一的调用号,用于标识该函数。在Linux中,系统调用号是通过一个整数来表示的,不同的系统调用对应不同的整数值。用户程序可以通过系统调用号来调用相应的系统调用,从而实现对操作系统的各种功能的访问和控制。常见的Linux系统调用包括open、read、write、close、fork、execve等。 ### 回答2: Linux系统调用号是一个唯一的标识符,用于标识操作系统提供给用户程序调用的各种功能和服务。通过系统调用,用户程序可以请求操作系统执行特定的操作,如打开文件、创建进程、读取网络数据等。 在Linux中,每个系统调用都有一个特定的号码,这个号码是由操作系统内核分配的。这些号码是在系统的头文件中定义的,例如unistd.h文件中包含了系统调用号的定义。 系统调用号在调用系统调用时使用,用户程序可以使用相关的系统调用接口来执行操作系统提供的功能。用户程序通常会使用C语言的库函数封装系统调用,以提供更方便的接口给开发者使用。 系统调用号的分配通常是由操作系统的开发者决定的,他们会根据不同的功能和服务进行划分和分配。在Linux中,常见的系统调用号包括打开文件(open)、读取文件(read)、写入文件(write)、关闭文件(close)等。 系统调用号的使用可以在用户程序中通过系统调用指令实现,用户程序将需要执行的系统调用号存放在相应的寄存器中,并调用int 0x80或sysenter指令触发系统调用。 总之,Linux系统调用号是一种用于标识和调用操作系统功能的机制,它允许用户程序直接访问操作系统提供的各种服务和功能。这种机制使得用户程序可以与操作系统交互,实现更加强大和灵活的应用程序开发。 ### 回答3: Linux系统调用号是用于在用户空间程序和内核空间之间进行交互的接口标识符。当用户空间程序需要执行某些操作时,如创建进程、读写文件、网络通信等,就会调用相应的系统调用系统调用号是一个整数,每个系统调用都有一个唯一的号码与之对应。Linux内核通过系统调用号来识别用户空间程序请求的具体操作。系统调用号由内核定义并存储在一个表中,用户程序通过中断指令或软中断指令触发系统调用,将调用号传递给内核。 对于不同的操作,有不同的系统调用号。例如: 1. 创建进程的系统调用号是`fork`,对应的调用号是2; 2. 打开文件的系统调用号是`open`,对应的调用号是5; 3. 写入文件的系统调用号是`write`,对应的调用号是1; 4. 进程退出的系统调用号是`exit`,对应的调用号是60。 用户程序通过指定正确的系统调用号,将自己的请求传递给内核。内核收到请求后,根据调用号执行相应的操作,完成后再返回结果给用户程序。系统调用号的定义与使用遵循一定的规范,保证了用户程序与内核之间的正确通信和操作,是Linux系统中非常重要的一个概念。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值