Linux 系统调用 dup()和dup2()

1、dup()

dup()系统调用会创建文件描述符的一个拷贝:

(1)新生成的文件描述符是进程中最小的未使用的文件描述符,0 、1 、2对应标准输入、标准输出、标准错误输出

(2)如果拷贝成功,那么原始的和拷贝的文件描述符可能会交叉使用

(3)两者都指向同一个打开的文件描述符,因此共享文件偏移量和文件状态标志

语法:

int dup(int oldfd);
oldfd: 旧的文件描述符的拷贝被创建

实例如下:

#include<stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
  
int main() 
{ 
    // open() returns a file descriptor file_desc to a  
    // the file "dup.txt" here" 
  
    int file_desc = open("dup.txt", O_WRONLY | O_APPEND); 
      
    if(file_desc < 0) 
        printf("Error opening the file\n"); 
      
    // dup() will create the copy of file_desc as the copy_desc 
    // then both can be used interchangeably. 
  
    int copy_desc = dup(file_desc); 
          
    // write() will write the given string into the file 
    // referred by the file descriptors 
  
    write(copy_desc,"This will be output to the file named dup.txt\n", 46); 
          
    write(file_desc,"This will also be output to the file named dup.txt\n", 51); 
      
    return 0; 
}

2、dup2()

dup2()系统调用与dup类似,它们之间的基本不同在于dup2()不使用最小的未使用的文件描述符编号,它使用指定的文件描述符编号。

语法:

int dup2(int oldfd, int newfd);
oldfd: old file descriptor
newfd new file descriptor which is used by dup2() to create a copy.

关键点:

dup()和dup2()系统调用都要包含unistd.h头文件

如果newfd描述符之间就打开了,那么在重用之前会被关闭

如果oldfd是非法的文件描述符,则系统调用失败,newfd也不会关闭

如果oldfd是有效的文件描述符,newfd的值和oldfd的值相同,那么dup2()什么都不做,直接返回newfd

 

使用dup2()系统调用的小技巧:

因为newfd可以是任何的文件描述符,以下的实例使用了C的标准输出stdout。这能实现把printf语句的输出写到oldfd关联的文件中:

#include<stdlib.h> 
#include<unistd.h> 
#include<stdio.h> 
#include<fcntl.h> 
  
int main() 
{ 
    int file_desc = open("tricky.txt",O_WRONLY | O_APPEND); 
      
    // here the newfd is the file descriptor of stdout (i.e. 1) 
    dup2(file_desc, 1) ;  
          
    // All the printf statements will be written in the file 
    // "tricky.txt" 
    printf("I will be printed in the file tricky.txt\n"); 
      
return 0; 
} 

printf的输出会写入tricky.txt中

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值