UNIX 系统调用:dup,dup2实现重定向

重定向一般在命令行里就是把原本输出到屏幕的数据转而输出到一个指定的文件当中。如

1 $ pwd > workdir.txt

此时workdir.txt内就存储了pwd命令的输出,当前所在的工作目录

默认情况下printf总是把内容输出到进程的打开文件表述符编号为1的对应的文件中(0-标准输入,1-标准输出,2-标准错误输出),通过这些数字索引可以在进程的打开文件表中找到对应的项。实现输入输出重定向只要把标准输入输出对应的表项替换即可。可以通过dup,dup2系统调用进行。它们的作用都是把指定索引对应的文件描述符复制一份,返回那份复制后在打开文件表中的对应索引。只不过dup2可以指定这个目的索引(如果对应索引已经有打开的文件描述符,则先关闭它),而dup是系统为用户进行选择一个未使用的位置。dup(2)过程可以参考这里的一份Linux早期源码说明:http://blog.sina.com.cn/s/blog_60c00c780100tc4n.html

int fd = open("output.txt", O_RDWR|O_CREAT, 0666);
int replaced = dup2(fd, STDOUT_FILENO);

上述代码即把程序输出重定向到一个output.txt的文件中。用fd对应的打开文件表项替换了STDOUT_FILENO对应的表项。如果成功的话,replaced值应该与STDOUT_FILENO一致。

给出一个稍微完整的代码:

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <errno.h>
 4 #include <fcntl.h>
 5
 6 int main() {
 7         int fd = open("data.out", O_RDWR | O_CREAT,0666);
 8         printf("file fd: %d\n", fd);
 9
10         int backup = dup(STDOUT_FILENO);
11         int replaced = dup2(fd, STDOUT_FILENO);
12
13         printf("duplicated file descriptor: %d\n", replaced);
14         perror("duplicate status ");
15
16         printf("haha\n");
17
18         dup2(backup, STDOUT_FILENO);
19
20         perror("restore status ");
21         close(fd);
22         perror("close status ");
23         return 0;
24 }

终端输出:

file fd: 3
duplicate status : Success
restore status : Success
close status : Success

文件内容:

$ cat data.out
duplicated file descriptor: 1
haha
时间: 2024-10-17 02:48:22

UNIX 系统调用:dup,dup2实现重定向的相关文章

dup/dup2输出重定向

函数原型:#includeint dup(int oldfd);int dup2(int oldfd,int newfd);dup用来复制oldfd所指的文件描述符.但复制成功时返回最小的尚未被使用的文件描述符.若有错误则返回-1,错误代码存入errno中.返回的新文件描述符和参数oldfd指向同一个文件,共享所有的锁定,读写指针,和各项权限或标志位..h> 1.打开一个新文件.h> 2.关掉标准输出文件符.h> 3.调用dup给文件描述符.h> 4.此时文件描述符变为1.h>

linux下dup/dup2函数的用法

系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号).dup2可以让用户指定返回的文件描述符的值,如果需要,则首先接近newfd的值,他通常用来重新打开或者重定向一个文件描述符. 他的原型如下: #include <unsitd.h> int dup(int oldfd); int dup2(int oldfd,int newfd); dup 和dup2都是返回新的描述符.或者返回-1并设置 errno变量.新老描述符共享文件的偏移量(位置)

dup/dup2函数学习

dup/dup2函数用来实现文件描述符之间的拷贝.对此,先来看看函数的声明: #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); dup函数 dup函数传入一个文件描述符,oldfd必须是已打开的文件描述符,否则dup函数调用失败.返回值为当前系统可用的最小文件描述符.测试程序如下: #include <stdio.h> #include <string.h> #include

文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write

文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write close(关闭文件) 相关函数 open,fcntl,shutdown,unlink,fclose 表头文件 #include<unistd.h> 定义函数 int close(int fd); 函数说明 当使用完文件后若已不再需要则可使用close()关闭该文件,二close()会让数据写回磁盘,并释放该文件所占用的资源.参数fd为

dup/dup2函数

原子操作(automic operation)指的是由多步组成的操作.如果该操作原子的执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集. 向打开文件时设置O_APPEND标志的文件写入是原子操作.内核每次对这种文件进行写之前,都将进程的当前偏移量设置到该文件的尾端处. O_EXCL | O_CREAT 是一个原子操作.如果文件已存在,则出错.否则,创建文件. dup/dup2两个函数都用于复制一个现存的文件描述符: #include<unistd.h> int du

笔记3-6: dup/dup2函数

dup与dup2函数 用于复制现存的文件描述符. 原型: #include <unistd.h> int dup(int fd); int dup2(int fd, int fd2); 两函数若成功则返回新描述符,出错则返回-1. dup函数返回一个新的描述符,并且这个新描述符一定是可用描述符中数值最小的一个. dup2函数使用fd2参数指定的数值返回新描述符,如果fd2已经打开,则先关闭fd2. 笔记3-6: dup/dup2函数,布布扣,bubuko.com

APUE之dup,dup2函数重定向标准输出实例

目的:重定向标准输出到一个文件之中. 定义这两个函数的头文件是 unistd.h  这个头文件同时定义了下面三个常量: * STDIN_FILENO = 0 标准输入 * STDOUT_FILENO = 1 标准输出 * STDERR_FILENO = 2 标准出错输出 dup和dup2函数 #include <unistd.h> int dup (int filedes); int dup2 ( int filedes,int filedes2); 两函数的返回值:若成功则返回新的文件描述符

dup/dup2

dup函数复制oldfd描述符给一个新的描述符,即这个新的文件描述符指向oldfd所拥有的文件表项.这个新的描述符是未被使用的最小的描述符,dup函数返回这个描述符 dup2函数和dup函数类似,它们的区别就是dup2可以用newfd参数指定新的描述符,如果newfd描述符已经打开,则覆盖;如果newfd等于oldfd,则dup2直接返回newfd. 这两个函数返回的新文件描述符和参数oldfd描述符共享同一文件表项 函数原型: #include<unistd.h>int dup(int ol

dup,dup2函数【转】

转自:http://eriol.iteye.com/blog/1180624 转自:http://www.cnblogs.com/jht/archive/2006/04/04/366086.html dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符.它们经常用来重定向进程的stdin.stdout和stderr.这两个函数的原形如下: C代码   #include <unistd.h> int dup( int oldfd ); int dup2( int old