如有錯誤,歡迎批評指正,本人也是才學APUE的菜鳥
先貼的程序代碼:
#include "apue.h"
#include <fcntl.h>
int main(int argc, char *argv[]) {
int val;
if(argc != 2)
err_quit("usage: 3-11 <descriptor#>");
if((val = fcntl(atoi(argv[1]),F_GETFL, 0)) < 0)
err_sys("fcntl error for fd %d", atoi(argv[1]));
switch(val & O_ACCMODE) {
case O_RDONLY:
printf("read only");
break;
case O_WRONLY:
printf("write only");
break;
case O_RDWR:
printf("read write");
break;
default:
err_dump("unknown access mode");
}
if(val & O_APPEND)
printf(", append");
if(val & O_NONBLOCK)
printf(", nonblocking");
if(val & O_SYNC)
printf(", synchronous writes");
#if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC) && (O_FSYNC != O_SYNC)
if(val & O_FSYNC)
printf(", synchronous writes");
#endif
putchar('\n');
exit(0);
}
程序中的O_ACCMODE:
O_ACCMODE<0003>:讀寫文件操作時,用於取出flag的低2位
O_RDONLY<00>:只讀打開
O_WRONLY<01>:只寫打開
O_RDWR<02>:讀寫打開
//
//
此程序的第 1 個參數指定文件描述符,並對於該描述符打印其所選擇的文件標誌說明。(我的編譯出的文件名是 3-11)
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/3-11$ ./3-11 0 < /dev/tty
read only
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/3-11$ ./3-11 1 > temp.foo
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/3-11$ cat temp.foo
write only
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/3-11$ ./3-11 2 2>>temp.foo
write only, append
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/3-11$ ./3-11 5 5<>temp.foo
read write
上面是運行結果。
這裏解釋以下各個命令:
1.首先值得注意的是命令中的第二個參數,它表示一個文件描述符,僅僅供程序中使用,程序打印此描述符的文件標誌說明。對命令沒有影響的。
2.符號 >> 也是重定向符號,與 > 的區別是,>> 以追加的方式寫入文件,而 > 會清除文件內容,然後寫入。
3.符號 <> 表示文件以可讀可寫的方式打開。
//
//
所以上面的各個命令含義是:
1.運行 3-11 程序,程序輸出的是文件描述符 0 的文件標誌說明,其中程序把 /dev/tty 重定向爲標準輸入。所以根據輸出可以知道 /dev/tty 是隻讀的。
2.運行 3-11 程序,程序輸出的是文件描述符 1 的文件標誌說明,其中程序把 temp.foo 文件重定向爲標準輸出 。cat temp.foo 即輸出文件 temp.foo 的內容。
3.運行 3-11 程序,程序輸出的是文件描述符 2 的文件標誌說明,其中程序把 temp.foo 文件重定向爲標準錯誤,並且文件 temp.foo 是以追加的方式打開的。(以追加的方式打開 temp.foo 作爲 ./3-11 的標準錯誤)
4.運行 3-11 程序,程序輸出的是文件描述符 5 的文件標誌說明,以讀寫的方式打開 temp.foo 作爲 ./3-11 命令的 5 號文件描述符。