dup等复制文件描述符函数

[root@bogon code]# cat b.c
#include<stdio.h>
#include<error.h>
#include<unistd.h>
#include<fcntl.h>
#define MAX_SIZE 5
int main()
{
    int fd=open("a.c",O_RDWR);
    int fd1,fd2,fd3,len;
    char buf[MAX_SIZE];
    len=read(fd,buf,MAX_SIZE);
    buf[len]='\0';
    printf("fd: %s \n",buf);;
    fd1=dup(fd);//复制fd文件描述符,注意文件偏移量是共享的,所以它的文件偏移量是fd当前的文件偏移量
    len=read(fd1,buf,MAX_SIZE);
    buf[len]='\0';
    printf("fd1: %s \n",buf);;
    return 0;
}
[root@bogon code]# gcc b.c
[root@bogon code]# ./a.out
fd: linux 
fd1: oswin 
[root@bogon code]# cat a.c
linuxoswindowsoshelloworldfine
[root@bogon code]# 

类似的还有int dup2(int oldfd,int newfd)如果旧的描述符没有关闭,该函数会隐式关闭,不过为了安全起见还是用close(oldfd)关闭比较好,用newfd来复制oldfd
除此之外还有一个int dup3(int oldfd,int newfd,int flags),也就是复制oldfd用newfd代替,其中flags可以设置标志位,不过目前只支持一个标志O_CLOEXEC,开启该标志位后子进程就不能够使用该文件描述符了
还有一个更加灵活的复制文件描述符的方法
newfd=fcntl(oldfd,F_DUPFD,startfd);这个方法好处在于可以把复制的文件描述符大小落在一定范围(大于或等于startfd)

posted on 2017-10-25 18:06  标配的小号  阅读(212)  评论(0编辑  收藏  举报

导航