深入理解linux下write()和read()函数
来源:互联网 发布:php 7 加密 编辑:程序博客网 时间:2024/05/23 01:25
1、write()
函数定义:ssize_t write (int fd, const void * buf, size_t count);
函数说明:write()会把参数buf所指的内存写入count个字节到参数放到所指的文件内。
返回值:如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。
附加说明:
(1)write()函数返回值一般无0,只有当如下情况发生时才会返回0:write(fp, p1+len, (strlen(p1)-len)中第三参数为0,此时write()什么也不做,只返回0。man手册给出的write()返回值的说明如下:
(2)write()函数从buf写数据到fd中时,若buf中数据无法一次性读完,那么第二次读buf中数据时,其读位置指针(也就是第二个参数buf)不会自动移动,需要程序员编程控制,
而不是简单的将buf首地址填入第二参数即可。如可按如下格式实现读位置移动:write(fp, p1+len, (strlen(p1)-len)。 这样write第二次循环时变会从p1+len处写数据到fp, 之后的也
由此类推,直至(strlen(p1)-len变为0。
(3)在write一次可以写的最大数据范围内(貌似是BUFSIZ ,8192),第三参数count大小最好为buf中数据的大小,以免出现错误。(经过笔者再次试验,write一次能够写入的并不只有8192这么多,笔者尝试一次写入81920000,结果也是可以,看来其一次最大写入数据并不是8192,但内核中确实有BUFSIZ这个参数,具体指什么还有待研究)
以下通过一个例子具体说明write函数用法
#include <string.h>#include <stdio.h>#include <fcntl.h>int main(){ char *p1 = "This is a c test code"; volatile int len = 0; int fp = open("/home/test.txt", O_RDWR|O_CREAT); for(;;) { int n; if((n=write(fp, p1+len, (strlen(p1)-len)))== 0) //if((n=write(fp, p1+len, 3)) == 0) { //strlen(p1) = 21 printf("n = %d \n", n); break; } len+=n; } return 0;}
此程序中的字符串"This is a c test code"有21个字符,经笔者亲自试验,若write时每次写3个字节,虽然可以将p1中数据写到fp中,但文件test.txt中会带有很多乱码。唯一正确的做法还是将第三参数设为(strlen(p1) - len,这样当write到p1末尾时(strlen(p1) - len将会变为0,此时符合附加说明(1)中所说情况,write返回0, write结束。
2、read()
函数定义:ssize_t read(int fd, void * buf, size_t count);
函数说明:read()会把参数fd所指的文件传送count 个字节到buf 指针所指的内存中。
返回值:返回值为实际读取到的字节数, 如果返回0, 表示已到达文件尾或是无可读取的数据。若参数count 为0, 则read()不会有作用并返回0。
注意:read时fd中的数据如果小于要读取的数据,就会引起阻塞。
read的用法比write较为简单,此处不叙述过多。由于笔者水平也有限,如果文中有谬误之处还恳请诸位指出,以免误导大家。
- 深入理解linux下write()和read()函数
- Linux下read和write函数复制一个文件
- linux下 open() write() read() close函数
- linux下 open() write() read() close函数
- linux下 open() write() read() close函数
- linux下 open() write() read() close函数
- linux下 open() write() read() close函数
- Linux下的read,write函数
- linux下 open() write() read() close函数
- linux下 open() write() read() close函数
- linux下 open() write() read() close函数
- linux下 open() write() read() close函数
- Linux -C 的read 和 write函数
- Linux -C 的read 和 write函数
- linux系统函数read和write
- Unix/Linux中的read和write函数
- Unix/Linux中的read和write函数
- linux-终端read和write函数
- Linux ubuntu下ssh使用
- 刚刚入职,以后在这记录学习笔记呀
- UITextField格式化电话号码和银行卡
- 软件设计原则(二)单一职责原则 -Single Responsibility Principle
- c++作业6
- 深入理解linux下write()和read()函数
- JavaScript 中为 JSON 字符串创建对象
- 线索化二叉树的构造及遍历
- 守护进程(精灵进程)&调用fork一次和两次的区别
- Convolutional Sequence to Sequence Learning
- Bitlocker 参数错误导致打不开移动硬盘的解决方法
- django用户注册
- maven发布时在不同的环境使用不同的配置文件
- CString,string,char*之间的转换(转)