文件IO操作(06)——dup和dup2函数

8、dup和dup2函数

#include <unistd.h>

int dup(int oldfd);

int dup2(int oldfd, int newfd);

#define _GNU_SOURCE /* See feature_test_macros(7) */

#include <unistd.h> /* 可见 程序优点测试 宏 */

int dup3(int oldfd, int newfd, int flags);

-------------------------------------------------------------------------------------------------

oldfd:现有的文件描述符

newfd:新的文件描述符

flags:

系统调用这些函数create创建一个拷贝oldfd的文件描述符.新旧两个文件描述符指向同一个文件(共享同一个文件表项)

dup() 复制oldfd文件描述符,并返回一个最小未分配的文件描述符作为新的文件描述符.

dup2() 用于指定一个整数来作为新的文件描述符,如果newfd关联了打开的文件,则会先关闭打开的文件。如果newfd和oldfd相等,则直接返回newfd,不会关闭文件。

dup3()是dup2()大体相同,除了:调用者可以将close-on-exec标记设置为新文件描述符的标志指定O_CLOEXEC 。其余的参考open(2)的说明。

如果oldfd等于newfd,那么dup3()会调用失败,并设置error为EINVAL。

-------------------------------------------------------------------------------------------------

RETURN VALUE

成功返回新的文件描述符newfd。出错返回-1,并设置 errno。

ERRORS

EBADF oldfd不是一个打开的文件描述符,或newfd出了允许的范围内的文件描述符。

EBUSY (仅仅在Linux)这可能会返回的dup2()或dup3()与openrace条件open(2)和dup()。

EINTR dup2()或dup3()调用被信号中断;参见signal(7)。

EINVAL (dup3())标志包含无效值。或者,oldfd等于newfd。

EMFILE 进程已经打开了文件描述符的最大数量的文件,再去尝试打开新文件,没有文件描述符可分配了。

dup2将STDOUT_FILENO重定向到文件

   1: #include <unistd.h>     //open,dup2,close...
   2: #include <stdio.h>
   3: #include <stdlib.h>
   4: #include <string.h>
   5: #include <fcntl.h>      //O_WRONLY 等宏
   6: #include <sys/types.h>
   7: #include <sys/stat.h>   //umask
   8: int main()
   9: {
  10:     //set umask (only in this program)
  11:     umask(0);
  12:     //只写打开一个文件,如果文件存在就截断为0.
  13:     int fd=open("1.txt",O_WRONLY | O_CREAT | O_TRUNC,664);
  14:     //关闭STDOUT_FILENO并将STDOUT_FILENO的关联到fd
  15:     int fd2=dup2(fd,STDOUT_FILENO);
  16:     char buf[1024]={0};
  17:     while(strncmp(buf,"exit",4)){
  18:         scanf("%s",buf);    
  19:         printf("%s\n",buf);
  20:     }
  21:     close(fd);
  22:     return 0;
  23: }
 使用fcntl来完成同样的操作
   1: #include <unistd.h>     //open,dup2,close...
   2: #include <stdio.h>
   3: #include <stdlib.h>
   4: #include <string.h>
   5: #include <fcntl.h>      //O_WRONLY 等宏
   6: #include <sys/types.h>
   7: #include <sys/stat.h>   //umask
   8: int main()
   9: {
  10:     //set umask (only in this program)
  11:     umask(0);
  12:         //open a file,only write mode,if file exist ,trunc
  13:     int fd=open("2.txt",O_WRONLY | O_CREAT | O_TRUNC,664);
  14:     //dup2,fd copy to stdout
  15:     //int fd2=dup2(fd,STDOUT_FILENO);
  16:     
  17:     close(STDOUT_FILENO);
  18:     //将fd复制到STDOUT_FILENO
  19:     fcntl(fd,F_DUPFD,STDOUT_FILENO);
  20:  
  21:     char buf[1024]={0};
  22:     while(strncmp(buf,"exit",4)){
  23:         scanf("%s",buf);    
  24:         printf("%s\n",buf);
  25:     }
  26:  
  27:     close(fd);
  28:     return 0;
  29: }

你可能感兴趣的:(文件IO操作(06)——dup和dup2函数)