前言
近期学习了一下UNIX环境高级编程,也做了一些相关知识点的笔记,以便后续自己的回忆以及阅读,同时方便读者的理解与应用。
目录
一、基础知识:
1.Unix/Linux中<和>的用法
1. <表示输入重定向,>表示输出重定向,>>表示将输出追加到设备末尾。
2. <>就表示既重定向输入,又重定向输出。
2.Unix中文件描述符的关联
Unix系统中通常将文件描述符0与标准输入相关联;1与标准输出相关联;文件描述符2与标准错误相关联。
二、代码段
1.a.out编译源码
代码如下(示例):
#include "apue.h"
#include <fcntl.h>
int
main(int argc, char *argv[])
{
int val;
if (argc != 2)
err_quit("usage: a.out<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");
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);
}
2.终端命令及输出结果:
代码如下(示例):
$./a.out 0 < /dev/tty
read only
$./a.out 1 > temp.foo
$ cat temp.foo
write only
$./a.out 1
read write
$./a.out 2 2>>temp.foo
write only, append
$./a.out 5 5<>temp.foo
read write
代码解读:
1. if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0)
这条命令相当于将输入的第一个参数做一次获取文件状态标志的处理,将得到的文件状态标志值赋给val,用于之后的文件状态标志判断和输出。有的小伙伴可能会对atoi这个函数有些许疑问,这个函数的主要作用是将传进去的数字字符转化为对应的整数形式。对于输入进来的文件描述符(文件句柄),自然就不是字符的形式了。
2. ./a.out 0 < /dev/tty
相当于将/dev/tty重定向为标准输入模式赋给0文件描述符,0作为文件描述符指向/dev/tty,之后作为参数向a.out传入参数后进行判断,相当于这个过程是0这个句柄读./dev/tty这个文件。
3. ./a.out 1 > temp.foo
相当于将temp.foo重定向为标准输出模式赋给1文件描述符,1作为文件描述符指向temp.foo,之后作为参数传入a.out进行判断,等同于这个过程是1这个句柄写temp.foo文件。
4. ./a.out 1
之所以输出结果为read write是因为由于0,1,2句柄都是指向你的登陆终端文件,而该终端是刻度写的,所以输出结果是read write。
5. ./a.out 2 2>>temp.foo
与第三点类似,但是是将temp.foo重定向为标准错误模式,同时是以>>这个将输出追加到文件末尾的方式进行重定向,2作为temp.foo这个文件的文件描述符,因此输出结果为write only,append。
6. ./a.out 5 5<>temp.foo
前面的基础知识点描述过<>符号的原理,是同时进行输入输出重定向,在这里5是作为文件描述符指向temp.foo这个文件的,将其重定向为输入输出,因此结果为read write。
总结
其实对于终端代码的部分很好理解,最终目的就是通过文件描述符(也就是文件句柄)指向相应改变的文件,在指向的同时对文件的读写属性进行一个改变。之后将句柄参数输入到我们的a.out程序中,从而对文件属性进行判断并输出相应的文件读写或者追加属性到我们的终端上。最后,欢迎小伙伴们一起讨论,指正批评,我也会不定时更新文章。谢谢大家的观看!