write()函數(shu)的功(gong)能介(jie)紹及(ji)實例
時間:2018-06-15 來源:未知(zhi)
功能:
向文件(jian)中寫入(ru)數據
頭文件:
#include
原型:
ssize_t write(int fd, const void *buf, size_t count);
參數:
fd: 文件描(miao)述符
buf: 存放(fang)要寫入的數據的緩沖區(qu)首地址
count: 想要(yao)寫入的(de)字節數
返回值:
>=0:成功(gong)寫入的字(zi)節數,0表(biao)示什么都沒寫入
-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第(di)三個(ge)參數表示想要(yao)寫入(ru)的字(zi)節數,返回值(zhi)表示實際寫入(ru)的字(zi)節數,-1表示出錯。如果要(yao)查看(kan)真正(zheng)寫入(ru)的字(zi)節數需要(yao)看(kan)返回值(zhi)。比如套接字(zi)文(wen)(wen)件或者(zhe)管(guan)道(dao)文(wen)(wen)件,有時(shi)候不能一次性把整(zheng)個(ge)buf全部寫入(ru)文(wen)(wen)件,此時(shi)需要(yao)循環寫入(ru)。
例:
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;
}
上述函數(shu)mywrite的功能是保證能夠成功寫入(ru)(ru)count字節,mywrite的參(can)數(shu)與write函數(shu)一樣。size表(biao)示已經(jing)寫入(ru)(ru)的字節數(shu),當(dang)成功寫入(ru)(ru)的字節數(shu)小于想要(yao)寫入(ru)(ru)的字節數(shu)時,循環(huan)往文件中寫,從(cong)buf偏(pian)移size處(chu)開始把(ba)剩(sheng)下的內容寫入(ru)(ru)文件,直(zhi)到(dao)size等(deng)于count跳出循環(huan)。
當寫入的文件(jian)時(shi)套接字(zi)或者(zhe)管道文件(jian)時(shi),有(you)一個發送(song)緩(huan)(huan)沖區(qu),如(ru)果(guo)緩(huan)(huan)沖區(qu)已滿,此時(shi)發送(song)阻塞,這(zhe)就是寫阻塞。如(ru)果(guo)設置為非阻塞模式O_NONBLOCK,緩(huan)(huan)沖區(qu)寫滿后,返回-1,錯誤(wu)原因Resource temporarily unavailable。
當寫(xie)(xie)(xie)(xie)入(ru)的文件時套接字或者管道文件時, 如果讀端關閉(bi),寫(xie)(xie)(xie)(xie)端還在向對(dui)端寫(xie)(xie)(xie)(xie)入(ru)數據時,此(ci)時會產生管道破(po)裂(lie)(lie)信號SIGPIPE,導(dao)致程序終止。如果寫(xie)(xie)(xie)(xie)進(jin)程沒有(you)報任何錯誤(wu)(wu)就(jiu)結束,很有(you)可能(neng)就(jiu)是管道破(po)裂(lie)(lie)造成,可以使用(yong)signal函數去(qu)捕捉(zhuo)該信號,判斷錯誤(wu)(wu)原(yuan)因(yin)
例: signal(SIGNAL, handler);

