下面来讨论一下I/O重定向的问题。
首先,学习一下dup()和dup2()重定向函数,这两个函数提供了复制文件描述符的功能。
#include
int dup(int oldfd);
int dup2(int oldfd, int newfd);
这两个函数调用成功之后,都返回一个oldfd文件描述符的副本,失败则返回-1。所不同的是,由dup()函数返回的文件描述符是当前可用文件描述符中的最小值,而dup2()函数则可以利用参数newfd指定要返回的文件描述符。如果参数newfd指定的文件描述符已经打开,系统想将其关闭,然后将oldfd指定的文件描述符复制到该参数。如果newfd等于oldfd,则dup2返回newfd,而不关闭它。(摘自《linux c编程实战》)
I/O重定向一般和管道结合使用的比较多,这里我们主要讨论I/O重定向和文件的结合使用。还是先看一个简单的程序,在与这个文件相同目录下有一个文件“test”,它的内容为:
abcdefg
- //test.c
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <unistd.h>
-
#include <sys/types.h>
-
#include <sys/stat.h>
-
#include <fcntl.h>
-
-
int main()
-
{
-
int fd;
-
char str[20] = {0};
-
-
fd = open("test", O_RDONLY);
-
dup2(fd, 0);
-
read(0, str, 20);
-
printf("%s", str);
-
return 0;
-
}
这个程序的执行结果是:
abcdefg
上面的程序主要的功能是将标准输入重定向到一个文件之后对标准输入的操作其实就是对文件fd的操作。
下面结合“通过文件共享来学习I/O重定向(上)——文件共享”中提到的三个数据结构来分析一下这三张表的情况。
对于这三张表,可以这样来理解。在没有调用dup2()函数进行重定向的时候,描述符0指向标准输入文件,当调用dup2(fd, 0)之后,将会把fd的值复制给标准输入0所指向的描述符变量。这么一复制之后,就会把标准输入关闭,同时将打开的那两个结构体变量释放(上图中用虚线来表示的),对于标准输入的话,就会从文件来读取。
阅读(1567) | 评论(0) | 转发(0) |