讲师博文
write()函数的功能介绍及实例 来源 : 未知     2018-06-15

功能:

向文件中写入数据

头文件:

#include

原型:

ssize_t write(int fd, const void *buf, size_t count);

参数:

fd: 文件描述符

buf: 存放要写入的数据的缓冲区首地址

count: 想要写入的字节数

返回值:

>=0:成功写入的字节数,0表示什么都没写入

-1: 写入失败,并设置全局变量errno

例:

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv[])

{

if (argc < 2)

{

fprintf(stderr, "Usage: %s \n", argv[0]);

return -1;

}

int fd = 0;

if (0 > (fd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 0666)))

{

perror("open");

return -1;

}

char buf[100] = "hello world!";

int ret;

if (strlen(buf) != write(fd, buf, strlen(buf)))

{

perror("write");

return -1;

}

printf("Write file successfully!\n");

close(fd);

return 0;

}

注意:write第三个参数表示想要写入的字节数,返回值表示实际写入的字节数,-1表示出错。如果要查看真正写入的字节数需要看返回值。比如套接字文件或者管道文件,有时候不能一次性把整个buf全部写入文件,此时需要循环写入。

例:

ssize_t mywrite(int fd, const void *buf, size_t count)

{

ssize_t size = 0;

int ret = 0;

while (size < count)

{

ret = write(fd, buf+size, count-size);

size += ret;

}

return size;

}

上述函数mywrite的功能是保证能够成功写入count字节,mywrite的参数与write函数一样。size表示已经写入的字节数,当成功写入的字节数小于想要写入的字节数时,循环往文件中写,从buf偏移size处开始把剩下的内容写入文件,直到size等于count跳出循环。

当写入的文件时套接字或者管道文件时,有一个发送缓冲区,如果缓冲区已满,此时发送阻塞,这就是写阻塞。如果设置为非阻塞模式O_NONBLOCK,缓冲区写满后,返回-1,错误原因Resource temporarily unavailable。

当写入的文件时套接字或者管道文件时, 如果读端关闭,写端还在向对端写入数据时,此时会产生管道破裂信号SIGPIPE,导致程序终止。如果写进程没有报任何错误就结束,很有可能就是管道破裂造成,可以使用signal函数去捕捉该信号,判断错误原因

例: signal(SIGNAL, handler);

扫码申领本地嵌入式教学实录全套视频及配套源码

上一篇:printf格式化输出函数详解,并附带最新典型案例

下一篇:让你快速高效的掌握linux内核编译过程

400-611-6270

Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5京公海网安备11010802025203号