APUE 2 第三章檔案I O學習 習題

2021-07-26 20:03:11 字數 1725 閱讀 3505

3.1 當讀寫磁碟檔案時,本章中描述的函式是否有緩衝機制?請說明原因。

在本章中,i/o操作檔案open,read,write,lseek,close均沒有緩衝機制,因為不帶緩衝的i/o。不帶緩衝,即每個read和write都呼叫核心中的乙個系統呼叫。

3.2 編寫乙個與3.12節中dup2功能相同的函式,要求不呼叫fcntl函式,並且要有正確的出錯處理

函式原型為:

dup2(int filedes,int filedes2);

dup2則可以用filedes2引數來指定新描述符的數值,如果filedes2已經代開,則先將其關閉。如果filedes等於filedes2,則dup2返回fildes2,而不去關閉它。

思路:

使用dup來實現,dup函式返回當前可用最小的數值,如果返回的數值和fileds2不相同,則關閉返回的檔案描述符,然後接著呼叫dup直到得到為filedes的檔案描述符。

**如下:

#include 

#include "apue.h"

#include

#include

#define maxn 4096

#define open_max 4096

using

namespace

std;

int mydup(int filedes,int filedes2)

if(filedes == filedes2)

while( (n == dup(filedes)) < filedes2 )

stack[top++] = n;

}close(filedes2);

if(dup(filedes) == -1)

for(i = 0;i < top; ++i)

return filedes2;

}int main(int argc, char *argv)

filedes = open(argv[1], o_rdwr);

if(filedes == -1)

filedes2 = atoi(argv[2]);

if(mydup(filedes, filedes2) != -1)

return

0;}

3.3 假設乙個程序執行下邊三個函式呼叫:

fd1 = open(pathname,oflags);

fd2 = dup(fd1);

fd3 = open(pathname,oflags);

畫出類似於3-3的結果圖,對fcntl作用於fd1來說,f_setfd命令會有什麼影響

f_setfd對於filedes設定檔案描述符標誌。新標誌值按第三個引數設定

3.4 在許多程式中都包含下邊的**:

dup2(fd,0);

dup2(fd,1);

dup2(fd,2);

if(fd > 2)

close(fd);

為了說明if語句的必要性,假設fd是1,畫出每次呼叫dup2時3個描述符即相應的檔案表項的變化情況。然後在畫出fd為3的情況

APUE 第三章 檔案I O

linux對檔案操作有open read write close lseek,這些api都是不帶緩衝的函式,相對於c庫,這些可移植的api內部實現是有緩衝區的。int open char pathname,int flag,int read int fd,void buf,size t size i...

apue學習筆記(第三章 檔案I O)

本章開始討論unix系統,先說明可用的檔案i o函式 開啟檔案 讀寫檔案等 unix系統中的大多數檔案i o只需用到5個函式 open read write lseek以及close open函式 返回乙個最小的未用描述符 include int open const char pathname,i...

APUE學習筆記 第三章 檔案I O

apue學習筆記 第三章 檔案i o 1 函式open和openat 呼叫open或openat函式可以開啟或建立乙個檔案 includeint open const char path,into flag,mode t made int openat int fd,const char path,...