linux下系统调用函数read()

Unix环境高级编程中,对read()函数作了如下定义:调用read函数从打开文件中读数据。#include<unistd.h>ssize_tread(intfd,voi... 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);———————————————————————————— 展开
 我来答
肆脚热书0Q
2018-10-19 · TA获得超过7485个赞
知道大有可为答主
回答量:4636
采纳率:11%
帮助的人:300万
展开全部
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

将其长度截短为0

write系统调用

write函数的三个参数:

(1)fildes: 文件描述符
(2)buf:指定写入数据的数据缓冲区
(3)nbytes:指定写入的字节数

函数返回值:

成功:已写的字节数

-1 :出错

0:未写入任何数据

例子:

运行结果:

read系统调用

read函数的三个参数:

(1)fildes:文件描述符

(2)buf:指定读入数据的数据缓冲区

(3)nbytes:指定读入的字节数

函数返回值:

成功:已读的字节数

0:未读入任何数据

-1:出错

例子:

运行结果:

close系统调用

通过对 close进行分析,我们会发现close并没有做什么实质工作,它没有刷新任何内核缓冲区,而仅仅是使文件描述符可以重用。
百度网友711eabb
2018-10-19 · TA获得超过709个赞
知道小有建树答主
回答量:727
采纳率:83%
帮助的人:321万
展开全部
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,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式