读书人

关于文件拷贝的实现有一段不懂。请问

发布时间: 2012-03-23 12:06:21 作者: rapoo

关于文件拷贝的实现,有一段不懂。。请教一下
据说这是很经典的拷贝文件代码

while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
if((bytes_read)==-1)&&(errno!=EINTR)) break;
else if(bytes_read>0)
{
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
{
if((bytes_write)==-1)&&(errno!=EINTR)) break;
else if(bytes_write==bytes_read) break;//写完了所有字节
else if(bytes_write>0)//只写了一部分,继续写。
{
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
if(bytes_write==-1) break;

}
}
之前大概定义了 from_fd是拷贝的源文件, to_fd是拷贝的目标文件
buff是存放读取字节的地方 BUFFER_SIZE 是1024
我的问题是在那句“只写了一部分,继续写”这个地方
写函数不是一次就将参数里指定数量的字符写入目标文件吗
怎么会发生只写了一部分的情况
什么情况下会发生这样的事情


[解决办法]
write不能保证全部写入。

请man 2 write
[解决办法]
write应该是不带缓冲的I/O函数,所以它一次能写多少应该是有个数量限制的。
[解决办法]
wirte返回实际写入的字节数
[解决办法]
因为写操作不是直接写到设备上,而是先写到缓冲区,然后由操作系统写到设备上。如果你写的时候,缓冲区快满了,就只能写一部分数据到缓冲区了,所以是先写一部分,继续写

读书人网 >C语言

热点推荐