dup和dup2函数-创新互联

我们都知道,一个进程在存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个进程,默认会有3个文件描述符存在,即0,1,2.0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准输出错误相关联。

创新互联建站制作网站网页找三站合一网站制作公司,专注于网页设计,做网站、成都网站制作,网站设计,企业网站搭建,网站开发,建网站业务,680元做网站,已为成百上千家服务,创新互联建站网站建设将一如既往的为我们的客户提供最优质的网站建设、网络营销推广服务!

      dup和dup2函数用来复制一个文件的描述符,用于文件描述符的重定向,重定向一个进程的0,1,2文件描述符。这两个函数的原型如下:

      int dup(int oldfd);

      int dup2(int oldfd,int newfd);

      利用dup函数,我们可以复制一个文件描述符,传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的旧描述符的拷贝,这意味着这两个文件描述符共享同一个数据结构,即所有的锁定,读写指针,各项权限和标志位等等。但复制成功时返回最小的尚未被使用的文件描述符,这个文件描述符指向oldfd所拥有的文件表项,例如,假如oldfd的值为1,当前文件文件描述符的最小值为3,那么新描述符3指向描述符1所拥有的文件表项。出错返回-1,错误代码在errno中。

      dup2函数可以用参数newfd指定新文件描述符的数值,若newfd已经被程序使用,系统就会将其关闭以释放该文件描述符。若newfd与oldfd相等,dup2将返回newfd,而不关闭它。dup2调用成功返回新的文件描述符,出错返回-1.dup2函数可以让用户自己指定文件描述符,它的作用也是复制文件描述符,将newfd描述符所对应的文件表改成oldfd所对应的文件表项。之后,newfd与oldfd指向同一个文件表,这样就将newfd重定向到oldfd。

      dup和dup2的区别就是可以用newfd参数指定新描述符的数值,如果newfd已经打开,则先将其关闭,如果newfd等于oldfd,则dup2返回newfd而不关闭它。

下面我们来看看一段有关dup的代码:

#include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   
   #define _FILE_ "./log"
  
  int main()
  {
      umask(0);
      int fd=open(_FILE_,O_CREAT |O_WRONLY,0644);
      printf("%d\n",fd);
      if(fd<0)
      {
          perror("open");
          return 1;
      }
      close(1);
      int new_fd=dup(fd);                                                                                                                                             
      if(new_fd<0)
      {
          perror("dup");
          return 2;
      }
  
      close(fd);
      printf("new_fd:%d\n",new_fd);
      int count=0;
      while(count++<100)
      {
          printf("hello world\n");
          fflush(stdout);
      } 
      close(new_fd);
      return 0;
  }

运行结果如下:

dup和dup2函数

      我们可以看到,当没有close(1)的时候,新open的文件描述符是3,当我们close(1)后并调用dup函数后,new_fd变成了1,本来将要输出到终端的内容被重定向到了log文件里。

dup2函数示例:

#include 
   #include 
   #include 
   #include 
   #include 
   #include 
   #include 
   
   
  #define _FILE_ "./log"
  
  int main()
  {
      umask(0);
      int fd=open(_FILE_,O_CREAT |O_WRONLY,0644);
      if(fd<0)
      {
          perror("open");
          exit(0);
      }
  
      close(1);
      int ret=dup2(fd,1);//复制oldfd到文件描述符1(标准输出)
      if(ret<0)
      {
          perror("dup2");                                                                                                                                             
          exit(1);
      }
      char buf[1024];
      int done=0;
      while(!done)
      {
          memset(buf,'\0',sizeof(buf));
          ssize_t _s=read(0,buf,sizeof(buf)-1);
          if(_s<=0)
          {
              perror("read");
              exit(2);
          }
          else if(_s>0)
          {
              buf[_s]='\0';                                                                                                                                           
              if(strncmp(buf,"quit",4)==0)
              {
                  done=1;
                  continue;
              }
          }
          printf("%s\n",buf);
          fflush(stdout);
      }
      return 0;
  }

运行结果如下:

dup和dup2函数

从结果可以看到,我们从标准输入输入的数据全都被重定向到了log文件里面了。                                                                                                                              

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


本文标题:dup和dup2函数-创新互联
分享URL:http://pwwzsj.com/article/dpdjoo.html