关于系统调用如:read的前世今生

本文探讨了系统调用read的基本原理,强调了当read因信号中断时如何处理EINTR错误。区分了可重启的系统调用,如read、write,以及在HTTP服务器中处理这些问题的重要性。同时,详细解释了TCP和UDP套接字的接收和发送缓冲区的工作机制,以及如何处理数据读取和写入的过程。最后提到了缓冲区的大小设置。
摘要由CSDN通过智能技术生成

1 函数原型

#include<unistd.h>
ssize_t read( int fd, void *buf, size_t nbytes);
返回值:读到的字节数,若已到达文件尾返回0;如出错返回-1

如果read成功,返回读到的字节数,到文件尾返回0. 正常情况肯定都大于等于0. 有错误情况就是-1(返回值)

2 重点 :当某一个信号造成中断while reading

  1. read() 在读取任何数据之前被信号打断(即由于没有可用数据而不得不阻塞),则它将返回-1并将其errno设置为[EINTR]。
    系统调用分为 低速系统调用和其他系统调用。低速系统调用是会可能让进程永远堵塞的一类系统调用
      在读某些类型的文件时,如果数据并不存在则可能会使调用者永远阻塞(管道、终端设备以及网络设备)。
      在写这些类型的文件时,如果不能立即接受这些数据,则也可能会使调用者永远阻塞。
      打开文件,在某种条件发生之前也可能会使调用者阻塞(例如,打开终端设备,它要等待直到所连接的调制解调器回答了电话)。
      pause(按照定义,它使调用进程睡眠直至捕捉到一个信号)和wait。
      某种ioctl操作。某些进程间通信函数

  2. 当read已经读取了部分数据,然后被中断了,此时会设置errno为 EINTR。。
         人为当碰到EINTR错误的时候,有一些可以重启的系统调用要进行重启,而对于有一些系统调用是不能够重启的。例如:accept、read、 write、select、和open之类的函数来说,是可以进行重启的。然后重启后又开始读取。

  3. 而当对于一个非堵塞的描述符,如果没有数据可读了,就会返回 -1,errno 被设置为EAGAIN。

  4. 综合上述得出,如果在一个http server 中,想要正常的去读文件写文件。就需要处理这两个错误。

代码:

  1. 关于read函数的处理:

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值