3.1 當讀/寫磁碟檔案時,本章中描述的函式確實是不帶緩衝機制的嗎?請說明原因:
1、本章中描述的read和write函式都是系統呼叫,這兩個函式都是在核心中進行的,所以是不帶緩衝的i/o函式。而帶有緩衝機制的函式是以記憶體空間作為緩衝區,避免不當操作降低多寫效能。
3.2 編寫乙個與3.12節中dup2功能相同的函式,要求不掉用fcntl函式,並且要有正確的出錯處理:
/*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
***> file name: test3_2.c
> author: king
> mail: [email protected]
> created time: 2023年08月05日 星期六 10時12分01秒
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*******/
#include
intmy_dup2(int fd, int fd2)
if (fd == fd2)
return fd2;
else
else
while (t != fd2);
while (i)
close(dups[--i]);
return t;}}
}
3.3 假設乙個程序執行下面3個函式呼叫:fd1 = open(path, oflags);
fd2 = dup(fd1);
fd3 = open(path, oflags);
畫出類似於圖3-9的結果圖。對fcntl作用於fd1來說,f_setfd命令會影響哪乙個檔案描述符,f_setfl呢?
(1)f_setfd標誌是檔案描述符標記,只作用於乙個程序的乙個描述符,所以對於fctnl作用於fd1來說,只會影響fd1。
(2)f_setfl標誌是檔案狀態標記,作用於任何程序中的所有描述符,所以對於fctnl作用於fd1來說,會影響fd1,fd2。
3.4 許多程式都包含下面一段**:dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
if (fd > 2)
close(fd);
為了說明if語句的必要性,假設fd是1,畫出每次呼叫dup2時3個描述符項及相應的檔案表項的變化情況。然後再畫出fd為3的情況。
標準輸入、標準輸出和標準錯誤的檔案描述符都指向同一檔案表項,可以使用標準輸入、標準輸出和標準錯誤的檔案描述符開啟該檔案,並設定檔案狀態標記或偏移量。
3.5 在bourne shell、bourne-again shell 和 korn shell中,digit1 > &digit2表示將公尺哦啊舒服digit1重定向至描述符digit2的同以檔案。請說明下面兩條命令的區別(1)./a.out > outfile 2>&1
這條命令首先將標準輸出重定向到outfile中,然後將標準錯誤檔案描述符重定向到標準輸出指向的檔案表項中,所以標準輸出和標準錯誤的檔案描述符均指向outfile。
(2)./a.out > 2>&1 outfile
這條命令首先將標準錯誤檔案描述符重定向到標準輸出指向的檔案表項中,然後標準輸出檔案描述符又重定向到outfile檔案中。所以最後標準輸出的檔案描述符和標準錯誤的檔案描述符不是指向同乙個檔案表項。
3.6 如果使用追加標誌開啟乙個檔案以便讀、寫,能否仍用lseek在任一位置開始讀?能否用lseek更新檔案中任一部分的資料?請編寫一段程式驗證
能。程式如下
/****
****
****
****
****
****
****
****
****
****
****
****
****
****
****
****
****
*** > file name: test3-6.c
> author : fedora
> mail: [email protected]
> create time: 2017-05-07
****
****
****
****
****
****
****
****
****
****
****
****
****
****
****
****
****
***/
#include "apue.h"
#include
#include
int main(void)
int offt;
if((offt=lseek(fd, 0, seek_end)) == -1)
int wb;
if((wb=write(fd,"test\n", 5)) < 0)
int rb;
char *rd;
if((rb=read(fd,rd,wb)) < 0)
if(write(stdout_fileno, rd, rb) != rb)
/* int n;
char *rd;
int wd;
while ((n=read(fd,rd,1024)) > 0)
if (write(stdout_fileno,rd,wd) != wd)
err_sys("write error!");
if (n < 0)
err_sys("write error");
*/exit(0);
}
unix 環境高階程式設計 閱讀第三章
3.4 函式creat 3.5 函式close 3.6 函式lseek 3.7 函式read 3.8 函式write 3.9 i o效率 3.10 檔案共享 3.11 原子操作 3.12 函式dup和函式dup2 3.13 函式sync 3.14 函式fcntl 3.15 函式ioctl 3.16 ...
unix 網路程式設計 第三章
包裹函式 就是對有錯誤返回值的函式的封裝。在unix網路程式設計中用大寫表示。err sys 必須要errno 的值才能輸出錯誤?執行緒函式遇到錯誤的時候 不設定errno的值,而是把error的值作為函式的返回值。必須檢查某個確定的錯誤,並處理它,而不是終止程序執行。unix errno 值 每當...
《UNIX 網路程式設計》 第三章課後習題第三題
按自己的想法實現的,肯定有更好的實現方式,放在這裡留個紀念。從下面開始 include include include include include include 具體的轉換過程,不做詳細注釋,有更好的實現方式 intinet pton loose int family,const char s...