高级I/O-----dup/dup2

dup/dup2

dup/dup2是两个用于指定文件操作符的方法,作用很相似,它是得两个文件描述符指向同一个file结构体,使file的引用计数为2,所以在使用的时候我们需要手动关闭另外一个不需要的。

dup:

dup的作用是将文件描述符指向一个最小的文件描述符。

       #include <unistd.h>

       int dup(int oldfd);
       int dup2(int oldfd, int newfd);

因为比较简单,就从代码来看吧

  1 #include<stdio.h>
  2 #include<sys/types.h>
  3 #include<sys/socket.h>
  4 #include<string.h>
  5 #include<fcntl.h>
  6 #include<unistd.h>
  7 #define _PATH_ "./test.log"
  8 
  9 
 10 int main()
 11 {
 12     umask(0);
 13     int fd=open(_PATH_,O_CREAT|O_WRONLY,0644);//打开一个新的文件
 14     if(fd<0)
 15     {
 16         perror("open");
 17     }
 18     close(1);//关掉需要用dup指向的文件描述符,注意(dup会使fd指向一个未使用的最           //小的文件描述符)
 19     int new_fd=dup(fd);//现在1号文件描述符指向刚才open的文件
 20     close(fd);   //关闭之前open的文件描述符,如果不关闭,则从fd中也能网文件                               //里写。
 21     char buf[1024];
 22     while(1)
 23     {
 24         memset(buf,‘\0‘,sizeof(buf));
 25         ssize_t size=read(0,buf,sizeof(buf)-1);
 26         if(size>0)
 27         {
 28             buf[size]=‘\0‘;
 29         }
 30         if(strncmp(buf,"quit",4)==0)
 31         {   
 32             break;
 31         {
 32             break;
 33         }
 34         printf("%s",buf);//printf会输出到1号文件描述符中
 35         fflush(stdout);
 36     }
 37     close(1);
 38     return 0;
 39 }

效果图

dup2:

 1 #include<stdio.h>
 2 #include<sys/types.h>
 3 #include<sys/socket.h>
 4 #include<string.h>
 5 #include<fcntl.h>
 6 #include<unistd.h>
 7 #define _PATH_ "./test.log"
 8 
 9 int main()
 10 {
 11     umask(0);
 12     int fd =open(_PATH_,O_CREAT|O_WRONLY,0644);
 13     if(fd<0)
 14     {
 15         perror("open");
 16     }
 17     close(1); //使用dup2所使用的重定向到的文件描述符必须先关闭
 18     int newfd=dup2(fd,1);
 19     close(fd);//关闭fd现在只有1号文件描述符指向所open的文件
 20     char buf[1024];
 21     printf("%d\n",newfd);
 22     while(1)
 23     {
 24         memset(buf,‘\0‘,sizeof(buf));
 25         fgets(buf,sizeof(buf)-1,stdin);
 26         if(strncmp(buf,"quit",4)==0)
 27         {
 28             break;
 29         }
 30         printf("%s",buf);
 31         fflush(stdout);
 32     }
 33     return 0;
 34 }

结果和dup一样

总结:

当需要往标准输出上打的调试信息,可以使用重定向的方式让它输出到相应的文件中。

时间: 2024-10-12 17:12:37

高级I/O-----dup/dup2的相关文章

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变量.新老描述符共享文件的偏移量(位置)

文件操作篇 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

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

VFS dup ,dup2

Linux支持各种各样的文件系统格式,如ext2.ext3.reiserfs.FAT.NTFS.iso9660等等,不同的磁盘分区.光盘或其它存储设备都有不同的文件系统格式,然而这些文件系统都可以mount到某个目录下,使我们看到一个统一的目录树,各种文件系统上的目录和文件我们用ls命令看起来是一样的,读写操作用起来也都是一样的,这是怎么做到的呢?Linux内核在各种不同的文件系统格式之上做了一个抽象层,使得文件.目录.读写访问等概念成为抽象层的概念,因此各种文件系统看起来用起来都一样,这个抽象

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输出重定向

函数原型:#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>

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

linux之dup和dup2函数解析

1. 文件描述符在内核中数据结构在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个进程,默认会有3个文件描述符存在(0.1.2), 0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准错误输出相关联,一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看. 下图可以清楚的说明问题:进程表项 ---------------- fd标志 文件指针