为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白猪掌柜的 2021-10-20 19:15:53
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);————————————————————————————
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

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并没有做什么实质工作,它没有刷新任何内核缓冲区,而仅仅是使文件描述符可以重用。



查看完整回答
反对 回复 2021-10-24
?
慕容708150

TA贡献1831条经验 获得超4个赞

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);

查看完整回答
反对 回复 2021-10-24
  • 2 回答
  • 0 关注
  • 463 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信