Linux系统编程之----dup函数与fcntl函数

一.dup

1.dup函数

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
/*

int dup(int oldfd); 
    作用:
        复制一个新的文件描述符,从一个空闲的区域当中找到一个最小
        例子:fd = 3; int fd1 = dup(fd);,此时fd1和fd都指向同一个文件
    返回值:

int dup2(int oldfd, int newfd);

*/
int main()
{
    int fd = open("a.txt", O_RDWR | O_CREAT, 0664);
    if(fd == -1)
    {
        perror("oepn");
        exit(-1);
    }
    printf("创建成功,创建的文件fd=%d\n", fd);

    int fd1 = dup(fd);
    printf("使用dup得到的fd1=%d\n", fd1);

    char *str = "hello world";
    printf("下面使用fd1操作fd创建的文件\n");

    int ret = write(fd1, str, strlen(str));
    if(ret == -1)
    {
        perror("write");
        exit(-1);
    }
    close(fd);
    close(fd1);
    return 0;
}

2.dup2函数

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

/*

    int dup2(int oldfd, int newfd);
    作用:
        重定向系统描述符,将oldfd 拷贝到newfd
        oldfd -> a.txt , newfd -> b.txt
        调用函数成功后:newfd 和 b.txt做close , newfd 指向了a.txt
        oldfd必须是一个有效的文件描述符
        oldfd和newfd值相同,相当于什么都没有做
*/
int main()
{
    int oldfd = open("oldfd.txt", O_RDWR | O_CREAT, 0664);
    if(oldfd == -1)
    {
        perror("oepn");
        exit(-1);
    }
    printf("创建成功,创建的文件fd=%d\n", oldfd);

    int newfd = open("newfd.txt", O_RDWR | O_CREAT, 0664);
    if(newfd == -1)
    {
        perror("oepn");
        exit(-1);
    }
    printf("oldfd=%d newfd=%d\n", oldfd,newfd);

    int fd2 = dup2(oldfd,newfd);
    //此时newfd不再指向newfd.txt而是指向了old.txt

    if(fd2 == -1)
    {
        perror("dup2");
        exit(-1);
    }

    char *str = "hello world";
    printf("下面使用newfd操作fd创建的文件\n");

    int ret = write(newfd, str, strlen(str));
    if(ret == -1)
    {
        perror("write");
        exit(-1);
    }
    close(oldfd);
    close(newfd);

    printf("oldfd=%d newfd=%d  fd2=%d\n", oldfd,newfd,fd2);

    return 0;
}

二.fcntl函数

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>

//int fcntl(int fd, int cmd, ... /* arg */);
// #include <unistd.h>
// #include <fcntl.h>
/*
    参数:
        fd:表示需要操作的文件描述符
        cmd:表示对文件描述符进行如何操作
            - F_DUPFD:复制文件描述符,复制的是第一个参数fd,得到一个新的文件描述符(返回值)
              int ret = fcntl(fd,F_DUPFD);

            - F_GETFL:获取指定的文件描述符状态flag
                获取的flag和我们通过open函数传递的flag是一个东西

            - F_SETFL: 设置指定的文件描述符状态flag
            比选项:O_RDONLY,O_RDWR,O_WRONLY,不可以被修改
            可选项:O_APPEND, O_NONBLOCK
                O_APPEND 表示追加数据
                NONBLOCK 设置成阻塞

        阻塞和非阻塞:描述的是函数调用的行为

*/

int main()
{
    //1.复制文件描述符
    // int fd = open("1.txt",O_RDONLY);
    // int ret = fcntl(fd, F_DUPFD);

    //2.修改或者获取文件状态
    int fd = open("1.txt",O_RDWR);
    if(fd == -1)
    {
        perror("open");
        return -1;
    }
    //获取文件描述符状态
    int flag = fcntl(fd,F_GETFL);
    flag |= O_APPEND;
    //修改文件描述符标记
    int ret= fcntl(fd,F_SETFL,flag);
    if(ret == -1)
    {
        perror("fcntl");
        return -1;
    }
    char *str = "world";
    write(fd, str,strlen(str));
    close(fd);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值