【Linux调试技巧----标准输出重定向到文件】dup2和dup的妙用
2015-07-19 21:51
726 查看
dup and dup2的剖析
dup和
dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个
file结构体。如果两个文件描述符指向同一个
file结构体,File
Status Flag和读写位置只保存一份在
file结构体中,并且
file结构体的引用计数是2。如果两次
open同一文件得到两个文件描述符,则每个描述符对应一个不同的
file结构体,可以有不同的File
Status Flag和读写位置。请注意区分这两种情况。
#include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd);
如果调用成功,这两个函数都返回新分配或指定的文件描述符,如果出错则返回-1。
dup返回的新文件描述符一定该进程未使用的最小文件描述符,这一点和
open类似。
dup2可以用
newfd参数指定新描述符的数值。如果
newfd当前已经打开,则先将其关闭再做
dup2操作,如果
oldfd等于
newfd,则
dup2直接返回
newfd而不用先关闭
newfd再复制。
下面这个例子演示了
dup和
dup2函数的用法,请结合后面的连环画理解程序的执行过程。
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int fd, save_fd;
char msg[] = "This is a test\n";
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;
}
相关文章推荐
- linux c 操作utmp 和 wtmp 文件接口
- linux命令4 find、三个时间属性、硬链接和软连接、用户名和密码文件、增加和删除用户组、usermod、su、sudo
- 2.1 linux文件系统相关函数
- Linux内存池技术
- linux常用命令2 chmod、chown
- linux常用命令1cd、ls、快捷键、mkdir、rmdir、rm、cp、mv、cat等
- linux无线网卡驱动安装
- linux的单用户模式与救援模式
- linux运行级别
- LINUX内核升级-更新网卡驱动
- linux常用的命令
- CentOS 6.5下PXE+Kickstart无人值守安装操作系统
- Linux 2.6.35内核配置 armv7 s5pv210 模块加载错误
- Linux写时拷贝技术(copy-on-write)
- Ubuntu14.04利用samba实现Linuxwindows共享出现Failed to add entry for user linux.问题的解决方案
- Linux netstat命令详解
- linux命令,系统安全相关命令--改变文件属性与权限(chgrp,chwon,chmod)
- linux下vi命令大全
- Linux上实现canny边缘检测
- linux页表创建与更新