头文件:
#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);
嵌入式物联网须要学的东西真的非常多,千万不要学错了路线和内容,导致人为要不上去!
无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!
某鱼上买估计至少要好几十。
扫码进群领资料