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 号文件描述符。

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