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 假設乙個程序執行下邊三個函式呼叫:f_setfd對於filedes設定檔案描述符標誌。新標誌值按第三個引數設定fd1 = open(pathname,oflags);
fd2 = dup(fd1);
fd3 = open(pathname,oflags);
畫出類似於3-3的結果圖,對fcntl作用於fd1來說,f_setfd命令會有什麼影響
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,...