六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 30|回复: 0

dup和dup2函数(转)

[复制链接]

升级  0%

58

主题

58

主题

58

主题

举人

Rank: 3Rank: 3

积分
200
 楼主| 发表于 2013-1-26 12:34:46 | 显示全部楼层 |阅读模式
 
原文url: http://learn.akae.cn/media/ch29s03.html
 
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函数的用法,请结合后面的连环画理解程序的执行过程。
<div style="margin-right: 0.5in; margin-left: 0.5in;" class="example">
例 29.2. dup和dup2示例程序

<div class="example-contents">#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;}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表