Linux系统调用函数read()返回值判断

函数原型

read(int fd,void* buf,size_t count);

函数说明

将从文件描述符fd对应的文件中读到的数据存在buf缓冲区中,每次读count字节,同时文件指针会随着移动

函数返回值

  • 当返回值大于0时:实际读到的字节数
  • 返回值=0:
    • 如果读的文件:说明文件读完了
    • 如果从管道或socket中读:说明对端关闭了
  • 返回值为-1:说明发生了异常,根据errno的值进一步判断
    • errno == EINTR 被信号中断
    • errno == EAGAIN(EWOULDBLOCK) 非阻塞方式读,并且没有数据
    • 其他值 代表 出现错误,可以获得返回值,然后利用strerror(ret)去打印错误信息
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux操作系统中,系统调用是应用程序(通常是用户空间程序)向内核请求服务的一种方式。它们提供了一种安全的接口,使得用户进程能够执行那些通常只能由特权级(如内核)才能完成的操作,比如文件I/O、网络通信等。Linux中的系统调用是由CPU的陷阱指令引发的,通常通过操作系统提供的`syscall`或`syscall_number`(如`int 0x80`在早期的x86架构)来实现。 每个系统调用在内核中都有一个对应的入口点,这些入口点通常是位于`arch/$(arch)/entry.S`这样的内核源码文件中。当你使用`syscall`指令时,实际上是将一个编号和一些参数放入CPU的特定寄存器(比如`eax`和`ebx`),然后进入内核的系统调用处理程序。 下面是一些关键概念: 1. **系统调用号(System Call Number)**:这是每个系统调用在内核中的唯一标识符,通常是一个整数,比如`read`、`write`、`open`等。 2. **系统调用表(System Call Table)**:内核维护了一个表格,将每个调用号映射到相应的函数地址。 3. **用户态和内核态**:系统调用发生在从用户态(非特权级别)到内核态(特权级别)的上下文中切换。 4. **参数传递**:用户模式下,参数通常通过寄存器传递,调用结束后通过返回值机制(如`eax`)传递结果回用户空间。 如果你对Linux系统调用的具体实现或者如何编写与之交互的用户空间代码感兴趣,我可以进一步讲解相关的编程接口如glibc的`syscall`宏,或者解释内核如何处理这些调用的过程。是否有特定的问题想要深入了解?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值