亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

麻煩大佬幫忙看一下,在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);
這樣就可以讀完了; 當然,這種程序通??磩e人代碼都是這樣寫的:
while(read(i,butter,MAX)>0){ write(j,butter,n);}close(i);close(j);

查看完整回答
反對 回復 2021-10-24
  • 2 回答
  • 0 關注
  • 582 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號