`include <unisted.h>安全
int dup2(int oldfd, int newfd);`app
練習題1函數
下面的程序輸出是什麼?學習
`#include csapp.h" int main() { int fd1, fd2; fd1 = Open("foo.txt", O_RDONLY, O); Close(fd1); fd2 = Open("baz.txt", O_RDONLY, O); printf("fd2 = %d\n", fd2); exit(0); }
`設計
答案:code
Unix進程生命週期開始時,打開的描述符賦給了stdin(描述符0)、stderr(描述度2)。open函數老是返回最低的未打開的描述符,因此第一次調用open會返回描述符3.調用close函數會釋放描述符3,最後對open的調用會返回描述符3,所以程序的輸出是」fd2=3「.blog
練習題2繼承
假設磁盤文件foobar.txt由6個ASCII碼字符「foobar」組成。那麼下列程序的輸出是什麼? 程序以下:生命週期
`#include "csapp.h" int main() { int fd1, fd2; char c; fd1 = Open("foobar.txt", O_RDONLY, O); fd2 = Open("foobar.txt", O_RDONLY, O); Read(fd, &c, 1); Read(fd2, &c, 1); printf("c = %c\n", c); exit(0); }
答案: 描述符fd1和fd2都有各自的打開文件表表項,因此每一個描述符對於foobar.txt都有它本身的文件位置。所以,從fd2的讀操做會讀取,foobar.txt的第一個字母,並輸出 c = f進程
練習題3 就像前面同樣,假設磁盤文件foobar.txt由6個ASCII碼字符」foobar「組成。那麼下列程序的輸出是什麼?
`#include "csapp.h" int main() { int fd; char c; fd = Open("foobar.txt", O_RDONLY, O); if(Fork()==0){ Read(fd, &c, 1); exit(0); } Wait(NULL); Read(fd, &c, 1); printf("c = %c\n", c); exit(0); }
答案:
由於子進程會繼承父進程的描述符表,以及全部進程共享的同一個打開文件表。所以,描述符fd在父子進程中都指向同一個文件表表項。當子進程讀取文件的第一個字母時,文件位置加1.所以,父進程會讀取第二個字節,而輸出就是
c = 0
練習題4
如何用dup2將標準輸入重定向到描述符5?
答案: 重定向標準輸入(描述符0)到描述符5,咱們將調用dup2(5,0)或者等價的dup2(5,STDIN_FILENO).
練習題5
假設磁盤文件foobar.txt由6個ASCII碼字符「foobar」組成。那麼下列程序的輸出是什麼?
`#include "csapp.h" int main() { int fd1, fd2; char c; fd1 = Open("foobar.txt", O_RDONLY, O); fd2 = Open("foobar.txt", O_RDONLY, O); Read(fd2, &c, 1); Dup2(fd2, fd1); Read(fd1, &c, 1); printf("c = %c\n", c); exit(0); }
答案:
由於咱們將fd1重定向到了fd2,輸出其實是
c = 0.
課上筆記:
本週是要學習深化第十章的內容,因此就將練習題好好看了一遍,有不少知識又懂得了不少。。很不錯。