zoukankan      html  css  js  c++  java
  • 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]='';
        printf("fd: %s 
    ",buf);;
        fd1=dup(fd);//复制fd文件描述符,注意文件偏移量是共享的,所以它的文件偏移量是fd当前的文件偏移量
        len=read(fd1,buf,MAX_SIZE);
        buf[len]='';
        printf("fd1: %s 
    ",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)

  • 相关阅读:
    C# MVC解决跨站请求伪造(appscan)
    .net中关于Url传参问题
    二月项目完成小结
    sql 获取时间
    ajax提交form表单
    C# 视图遍历List数组
    C#遍历指定文件夹中的所有文件
    C#关于文件的操作
    .net 文件上传到服务器【转】
    Server.MapPath获取各级目录【转】
  • 原文地址:https://www.cnblogs.com/biaopei/p/7730630.html
Copyright © 2011-2022 走看看