Linux IO函数的使用和区别
作者:网络转载 发布时间:[ 2015/7/8 13:34:31 ] 推荐标签:操作系统
Linux系统中的IO函数主要有read、write、recv、send、recvmsg、sendmsg、readv、writev,本篇主要介绍他们的使用以及区别。
read函数:
#include <unistd.h>
ssize_t read(int fd,void *buf,size_t count);
read函数从文件描述符fd对应的文件中,读取count字节,放在buf缓冲区。如果count为0,read返回为0,不进行其他操作;如果count的值大于SSIZE_MAX,结果不能预料。在读取成功的时候,文件对应的读取位置指针,,向后移动位置,大小为成功读取的字节数。
如果read执行成功,访回读取的字节数;当返回为-1时候,读取函数有错误发生。如果已经达到文件的末尾,返回0;其中,ssize数据类型是不同于int、long类型,它是符号数,具体实现时,可能是int,也可能是long。
write函数:
#include <unistd.h>
ssize_t write(int fd,const void *buf,size_t count);
参数含义与read类似。
recv函数:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int s,void *buf,size_t len,int flags);
recv函数用于接受数据,该函数从套接字s中接收数据放到缓冲区buf中,buf长度为len,操作的方式由flags指定,第一个参数s是套接字文件描述符,它是由系统调用socket函数返回。第二个参数buf是一个指针,指向接收网络的缓冲区。第三个参数len表示缓冲区的大小,以字节为单位。第四个参数flags用于设置接收数据的方式:
MSG_DONTWAIT:这个标志将单个IO操作设为非阻塞,而不需要在套接字上打开非阻塞标志,执行IO,然后关闭非阻塞标志。
MSG_ERRQUEUE:该错误的传输依赖于所使用的协议。
MSG_OOB:这个标志可以接收带外的数据,而不是接收一般数据。
MSG_PEEK:这标志查看可读的数据,在recv函数执行后,内核不会将这些数据丢弃。
MSG_TRUNC:在接收数据后,如果用户的缓冲区大小不足以完全复制缓冲区里的数据,则将数据截掉,仅靠复制用户缓冲区大小的数据,其他的数据将丢弃。
MSG_WAITALL:告诉内核在没有读到请求的字节数之前不要读操作返回。如果系统支持这个标志,可以去掉readn()函数而用下面的替代:
#define readn(fd,ptr,n) recv(fd,ptr,n,MSG_WAITALL).
即使设置了MSG_WAITALL,如果发生以下情况:a扑捉一个信号;b连接终止;c在套接字上发生错误,这个函数返回的字节数仍然比请求的少。
当指定MSG_WAITALL标志时,函数会复制与用户指定的长度相等的数据。如果内核中的数据不能满足要求,会一直等待到数据足够的时候才返回。
函数recv()的返回值是成功接收到的字节数,当返回值为-1时错误发生。
recv()通常用于TCP,UDP使用recvfrom函数接收数据,当然在数据报套接字绑定了地址和端口后,也可以使用recv函数接收数据。
recv()从内核的接收缓冲区中复制数据到用户指定的缓冲区,当内核中的数据比指定的缓冲区小时,一般情况下(没有采用MSG_WAITALL标志)会复制缓冲区中的所有数据到用户缓冲区,并返回数据的长度。当内核中的数据比指定的缓冲区多时,会将用户指定的长度的接收缓冲区中的数据复制到用户指定地址,其余的数据需要下次调用接收函数时再复制,内核在复制用户指定的数据后,会销毁已经复制完毕的数据,并进行调整。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11