在U
创新互联建站是一家专注于
成都网站制作、做网站与策划设计,漳平网站建设哪家好?
创新互联建站做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:漳平等地区。漳平做网站价格咨询:13518219792nix下,系统重定向是使用dup和dup2函数完成的
在学习使用这两个函数之前,必须要搞懂一个概念就是文件描述符
摘自:《文件描述符和文件指针的区别》
文件描述符就是open文件时产生的一个整数,直到一个索引作用,它用于UNIX系统中,用于标识文件。
文件指针是指向一个FILE的结构体,这个结构体里有一个元素就是文件描述符。它用于ANSI C标准的IO库调用中,用于标识文件。
既然FILE中包含文件描述符元素,可以用fopen()直接获取指针fp,然后使用fp获得fp中所包含文件描述符fd的信息。
文件描述符应该是唯一的,但文件指针(值)却不是唯一的,但指向的对象却应该是唯一的。
FILE *中除了包含了fd信息,还包含了IO缓冲,所以可以理解为FILE是对fd的墙头,是C标准形式,所以FILE *比fd更适合跨平台,应该多用fopen在,少用open。
C语言文件指针与文件描述符之间可以相互转换:
int fileno(FILE *stream);
FILE *fdopen(int fd, const char *mode);
来看一下下图的实现过程
简单明了,不解释过多。再来看一下程序:
结合上图理解一下过程。
[c]
#include
#include
#include
#include
#include
#include
int main(void)
{
int fd, save_fd;
char msg[] = "This is a test
";
fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
if(fd<0) {
perror("open");
exit(1);
}
save_fd = dup(STDOUT_FILENO);
dup2(fd, STDOUT_FILENO);
close(fd);
write(STDOUT_FILENO, msg, strlen(msg));
dup2(save_fd, STDOUT_FILENO);
write(STDOUT_FILENO, msg, strlen(msg));
close(save_fd);
return 0;
}
[/c]
上面的程序按照流程图就很容易理解了,再多说两句就是STDOUT_FILENO也就是“1”的文件描述符
再有就是当改变输出方向后,不仅仅write函数,使用printf函数结果也都是一样的......haha
名称栏目:UC编程:输入输出重定向(系统调用)-创新互联
网站地址:http://cdweb.net/article/jjecp.html