功能:
向文件中寫入數據
頭文件:
#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);