Linux C编程学习笔记(4):dup,dup2,fcntl系统调用

fcntl_access.c

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

//自定义错误处理函数
int my_err(const char *err_string,int line)
{
    fprintf(stderr,"line:%d ",line);
    perror(err_string);
    exit(1);
    return 0;
}

int main()
{ 
    int ret;
    int access_mode;
    int fd;

    if((fd=open("example_3.c",O_CREAT|O_TRUNC|O_RDWR,S_IRWXU))==-1)
    {
        my_err("open",__LINE__);
    }

    //设置文件打开方式
    if((ret=fcntl(fd,F_SETFL,O_APPEND))<0)
    {
        my_err("fcntl",__LINE__);
    }

    //获取文件打开方式
    if((ret=fcntl(fd,F_GETFL,0))<0)
    {
        my_err("fcntl",__LINE__);
    }
    access_mode=ret&O_ACCMODE;
    //O_ACCMODE取得文件打开方式的掩码,值为3。做与运算是为了取得ret的最后两位的值

    if(access_mode==O_RDONLY)
    {
        printf("example_3 access mode:read only");
    }
    else if(access_mode==O_WRONLY)
    {
        printf("example_3 access mode:write only");
    }
    else if(access_mode==O_RDWR)
    {
        printf("example_3 access mode:read*write");
    }

    if(ret&O_APPEND)
    {
        printf(",append");
    }
    if(ret&O_NONBLOCK)
    {
        printf(",nonblock");
    }
    if(ret&O_SYNC)
    {
        printf(",sync");
    }
    printf("\n");

    return 0;
}

dup、dup2函数

1.原型
  #include<unistd.h>
  int dup(int oldfd);
  int dup2(int oldfd, int newfd);
2.功能

  利用函数dup,我们可以复制一个文件描述符。传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这就意味着,这两个描述符共享所有的锁定、读写指针和各项权限或标志位。例如,如果我们对一个文件描述符执行lseek操作,另一个文件描述符的读写位置也会随着改变。
  dup2与dup的区别就是dup2返回的文件描述符可以通过第二个参数“可用的文件描述符”指定。若newfd已经被程序使用,系统就会将其关闭以释放该文件描述符;若oldfd与newfd相等,则dup2返回newfd,而不关闭它。dup2调用成功,返回新的描述符,出错返回-1。
  通过dup或dup2函数对标准输入和标准输出的操作来实现Shell中的重定向功能(喵喵喵~T.T不是很懂。。。)


fcntl函数

1.原型
  #include<unistd.h>
  #include<fcntl.h>
  int fcntl(int fd, int cmd);
  int fcntl(int fd, int cmd, long arg);
  int fcntl(int fd, int cmd, struct flock *lock);
2.功能

  用来对已打开的文件描述符进行各种控制操作以改变已打开文件的各种属性。fcntl的功能依据cmd值的不同而不同。

3.参数

  fcntl的功能依据cmd值的不同而不同。
  ① F_DUPFD:fcntl功能与dup一样,复制由fd指向的文件描述符。
  ② F_GETFD:获取文件描述符的close-on-exec标志。
  ③ F_SETFD:设置文件描述符的close-on-exec标志为第三个参数arg的最后一位。
  ④ F_GETFL:获得文件打开的方式。
  ⑤ F_SETFL:设置文件打开的方式为arg指定的方式。(O_APPEND/O_NONBLOCK/O_AYNC)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值