麻烦大佬帮忙看一下,在linux下系统调用函数read()!

Unix环境高级编程中,对read()函数作了如下定义:调用read函数从打开文件中读数据。#include <unistd.h>ssize_t read(int fd, void *buf, size_t nbytes);返回值:读到的字节数,若已到文件尾,返回0;若出错,返回−1如read成功,则返回读到的字节数。如已到达文件的尾端,则返回0。****************************************************************我想知道,对于一个文件,如果里面的数据大于定义的nbytes的话,是怎么样的?比如: man ls >ls.txt用read()和write()函数,将ls.txt里面的数据复制到copy.txt中其中butter[MAX](#define MAX 10)****************************************************************我的理解,ls的man手册中的数据要比定义的butter[MAX]数据大的多,那为什么用下面程序就可以进行复制数据?————————————————————————————//省略int i,j,n;i=open(argv[1],O_RDONLY);j=open(argv[2],O_WDONLY|O_CREAT|O_TRUNC,664);//省略判断之类的n=read(i,butter,MAX);while(n>0){ write(j,butter,n);}close(i);close(j);————————————————————————————

白猪掌柜的
浏览 520回答 2
2回答

蝴蝶刀刀

open系统调用open函数的三个参数:(1)path是已经存在的文件的路径;(2)oflags参数:若值为 O_RDONLY ,就以只读方式打开文件;若值为 O_WDONLY,就以只写方式打开文件;若值为 O_RDWR,就以读写方式打开文件;(3)参数mode:文件的权限,对于一个已经存在的文件,参数mode是没有用的,通常将其省略,因此这种情况下open调用只需两个参数。创建新文件:前面已经说到,当文件不存在时,open会创建一个新文件(仅能是普通文件),我们只需要用 or操作向open的 oflags参数中加入标志O_CREAT即可。这样可以创建一个新的只读文件,但是这没有任何意义,因为所创建的新文件没有任何可读内容。因此一般需要 O_CREAT与 O_WRONLY或 O_RDWR一起使用,此时就需要mode参数了。例如:int fd = open("/home/LY/newfile",O_RDWR | O_CREAT,MODE_FILE)参数mode仅在创建新文件时有效,对于一个已经存在的文件,它没有任何作用。关于open的flags参数:除了以上介绍的 open标志外,open还有许多标志,具体的如下表所示:标志解释O_RDONLY只读方式打开O_WRONLY只写方式打开O_RDWR读写方式打开O_APPEND每次写都追加到文件的尾端O_CREAT若文件不存在则创建文件O_DSYNC设置同步I/O方式O_EXCL如果文件已存在,则出错;必须与O_CREAT一起使用O_NOCTTY不将此设备作为控制终端O_NONBLOCK不等待命名管道或特殊文件准备好O_RSYNC设置同步I/O方式O_SYNC设置同步I/O方式O_TRUNC将其长度截短为0write系统调用write函数的三个参数:(1)fildes: 文件描述符(2)buf:指定写入数据的数据缓冲区(3)nbytes:指定写入的字节数函数返回值:成功:已写的字节数-1 :出错0:未写入任何数据例子:运行结果:read系统调用read函数的三个参数:(1)fildes:文件描述符(2)buf:指定读入数据的数据缓冲区(3)nbytes:指定读入的字节数函数返回值:成功:已读的字节数0:未读入任何数据-1:出错例子:运行结果:close系统调用通过对 close进行分析,我们会发现close并没有做什么实质工作,它没有刷新任何内核缓冲区,而仅仅是使文件描述符可以重用。

慕容708150

n=read(i,butter,MAX);while(n>0){ write(j,butter,n);}close(i);close(j);如果我说的没有错的话, 文件大于butter的话是不可能一次读写完成的; 原因是你在循环中没有重复读写;n=read(i,butter,MAX);while(n>0){ write(j,butter,n);n=read(i,butter,MAX);}close(i);close(j);这样就可以读完了; 当然,这种程序通常看别人代码都是这样写的:while(read(i,butter,MAX)>0){ write(j,butter,n);}close(i);close(j);
打开App,查看更多内容
随时随地看视频慕课网APP