文件描述符fd,open函数

open函数可以打开或创建一个文件。

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

返回值:成功返回新分配的文件描述符(其实是内核中文件描述符表的索引值),出错返回-1并设置errno。

pathname参数是要打开或创建的文件名,既可以是相对路径也可以是绝对路径。

flags参数有一系列常数值可供选择,可以同时选择多个常用按位或运算符连接起来,所以这些常数的宏定义都以O_开头,表示or。

必选项:以下三个常数中必须指定一个,且仅允许指定一个:

        O_RDONLY 只读打开

        O_WRONLY 只写打开

        O_RDWR 可读可写打开

可选项:可以同时指定0个或多个,和必选项按位或起来作为flags参数:

        O_CREAT 若此文件不存在则创建它。必须要提供第三个参数mode,表示文件的访问权限。

        O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则返回出错。

        O_TRUNC 如果文件已存在,并且以只写或可读可写方式打开(有写操作),则将其长度截断为0字节。

        O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾。

        O_NONBLOCK 对于设备文件,以O_NONBLOCK方式打开可以做非阻塞I/O。

mode参数:指定文件权限,可以用八进制数表示,比如0666表示-rw-r--r--,也可以用S_IRUSR、S_IWUSR等宏定义按位或起来表示。

文件描述符:

1.参数fd(open函数的返回值),是要关闭的文件描述符。当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是,作为一个合格的程序员,还是要手动关闭,因为在程序运行时间特别长的情况下,会浪费资源。

2.由open返回的文件描述符一定是该进程尚未使用的最小描述符。 

代码演示如下:

#include "./common/head.h"

/*功能:
 *创建文件1、文件2,关闭文件1,创建文件3,验证fd是否一直为最小的文件描述符。
*/

int main(int argc, char **argv)
{
    if(argc != 4){    //./a.out file1 file2 file3
        printf("usage: cmd file1 file2 file3\n");
        exit(1);
    }

    int fd1, fd2, fd3;
    fd1 = open(argv[1], O_RDWR | O_CREAT, 0777);  //文件权限不一定是077,还与掩码umask有关系
    if(fd1 < 0){
        perror("OPEN1");
        exit(1);
    }else{
        printf("fd1 = %d\n", fd1);    //3。由于0、1、2是stdin、stdout、stderr,所以从3开始
    }
    fd2 = open(argv[2], O_RDWR | O_CREAT, 0777);
    if(fd2 < 0){
        perror("OPEN2");
        exit(1);
    }else{
        printf("fd2 = %d\n", fd2);    //4
    }
    
    close(fd1);    //关闭文件1,此时fd=3被释放

    fd3 = open(argv[3], O_RDWR | O_CREAT, 0777);
    if(fd3 < 0){
        perror("OPEN3");
        exit(1);
    }
    printf("fd3 = %d\n", fd3);    //3
    
    close(fd2);
    close(fd3);

    return 0;
}

解析:

创建文件1,文件2 ,由于进程启动会首先打开0,1,2(分别对应stdin、stdout、stderr),所以fd1=3,fd2=4;

关闭文件1后,fd=3被释放出来,所以再创建文件3时,fd3被分配的是当前最小描述符,即刚刚被释放的fd1,所以fd=3。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值