高级I/O模型(2)--dup/dup2
来源:互联网 发布:js实现数据绑定 编辑:程序博客网 时间:2024/05/29 15:21
dup和dup2是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。
这两个函数的原形如下:
利用函数dup,我们可以复制一个描述符。
传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这意味着,这两个描述符共享同一个数据结构。
下面是用来说明dup函数使用方法的代码片段:
int fd1, fd2; ... fd2 = dup( fd1 );
下面简单介绍一个的示例代码:
//在文件log里打印十次hello world#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <fcntl.h>#include <sys/stat.h>int main(){ //close(1); int fd = open("./log", O_WRONLY|O_CREAT, 0644); if(fd < 0) { perror("open\n"); return 1; } close(1); fd = dup(fd); int count = 0; while(count++ < 10) { printf("hello world!\n"); fflush(stdout); } close(fd); return 0;}
运行结果:
运行结果:
需要注意的是,我们可以在调用fork之前建立一个描述符,这与调用dup建立描述符的效果是一样的,子进程也同样会收到一个复制出来的描述符。
dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id。
dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。
下面我们用一段代码加以说明:
int oldfd; oldfd = open("./log",(O_WRONLY | O_CREATE), 0644 ); dup2( oldfd, 1 ); close( oldfd );
本例中,我们打开了一个当前目录下的一个新文件,称为“log”,并收到一个文件描述符,该描述符叫做fd1。
我们调用dup2函数,参数为oldfd和1,这会导致用我们新打开的文件描述符替换掉由1代表的文件描述符(即stdout,因为标准输出文件的id为1)。
任何写到stdout的东西,现在都将改为写入名为“log”的文件中。
下面简单介绍一个的示例代码:
//在文件log里打印十次hello world#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <fcntl.h>#include <sys/stat.h>int main(){ umask(0); int fd = open("./log", O_WRONLY|O_CREAT, 0644); if(fd < 0) { perror("open"); return 1; } close(1); int ret = dup2(fd, 1); int count = 0; while(count++ < 10) { printf("hello world!\n"); fflush(stdout); } close(fd); return 0;}
运行结果:
需要注意的是,dup2函数在复制了oldfd之后,会立即将其关闭,但不会关掉新近打开的文件描述符,因为文件描述符1现在也指向它。
阅读全文
0 0
- 高级I/O模型(2)--dup/dup2
- 高级I/O-----dup/dup2
- 高级I/O函数之socketpair和dup/dup2
- 文件I/O——dup和dup2函数
- socketpair和dup---高级I/O
- dup2()&&dup()
- dup/dup2
- dup、dup2
- dup dup2
- dup,dup2
- dup, dup2
- dup()、dup2()
- dup & dup2
- 高级I/O模型(1)--socketpair
- dup与dup2 转:《UNIX环境高级编程》
- 高级I/O函数(writev、senfile、dup、mmap、splice、tee)
- dup,dup2,2>&1,tee用法
- 理解dup和dup2
- jq页面比较时间大小
- 剑指offer——左旋转字符串(旋转的思想)
- java中枚举在游戏开发中作用
- android studio 非常实用简单的快捷键
- QT调用vc dll中文乱码的问题
- 高级I/O模型(2)--dup/dup2
- My安卓知识3--多个activity之前共享数据的方法
- 在java的Map集合中,怎样更改value的值?
- equal和“==”的区别
- Python编程之基础
- centos7下git服务器端搭建
- 移动端web页面使用position:fixed问题总结
- Android内存泄露检测之TextLine
- Oracle序列(Sequence)创建、使用、修改、删除