APUE第三版 程序 3-11(利用 fcntl 查看已打開文件的文件狀態標誌)

如有錯誤,歡迎批評指正,本人也是才學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 號文件描述符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章