linux open文件描述符,linux系统编程之文件与IO:文件描述符、open,close

什么是IO?输入/输出是主存和外部设备之间拷贝数据的过程

设备->内存(输入操作)

内存->设备(输出操作)高级I/O

ANSI C提供的标准I/O库称为高级I/O,通常也称为带缓冲的I/O低级I/O

通常也称为不带缓冲的I/O

2. 文件描述符:fd对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的。

当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数)。后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息。

一个进程启动时,默认打开了3个文件,标准输入、标准输出、标准错误,对应文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),这些常量定义在unistd.h头文件中。C库函数中与之对应的是:stdin,stdout,stderr,不过这三个是FILE指针类型。

3.文件描述符与文件指针相互转换

可以通过以下两个函数实现:fileno:将文件指针转换为文件描述符

#include

int fileno(FILE *stream)

测试程序:#include #includeint main(void){    printf("fileno(stdin) = %d\n", fileno(stdin));    printf("fileno(stdout) = %d\n", fileno(stdout));    printf("fileno(stderr) = %d\n", fileno(stderr));return 0;}测试结果:

302bad67f9dda864b7616bad5169f95e.gif

7547481_1373552241Lp7Z.jpg (4.21 KB, 下载次数: 0)

2013-7-12 09:08 上传

fdopen:将文件描述符转换为文件指针#include

FILE *fdopen(int fd, const char *mode)    //mode :r,w,r+,w+,a,a+

4.文件系统调用open系统调用有几种方法可以获得允许访问文件的文件描述符。最常用的是使用open()(打开)系统调用

函数原型

#include

#include

#include

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

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

参数

path :文件的名称,可以包含(绝对和相对)路径

flags:文件打开模式

mode:用来规定对该文件的所有者,文件的用户组及系 统中其他用户的访问权限

返回值

打开成功,返回文件描述符;

打开失败,返回-1

文件打开方式:

302bad67f9dda864b7616bad5169f95e.gif

7547481_1373552242TC5j.jpg (22.86 KB, 下载次数: 0)

2013-7-12 09:08 上传

O_EXCL表示:当O_EXCL|O_CREAT时,若文件存在,则打开失败,不存在,则打开成功

访问权限:

302bad67f9dda864b7616bad5169f95e.gif

7547481_1373552244TYtS.jpg (31.51 KB, 下载次数: 0)

2013-7-12 09:08 上传

open系统调用的几点说明:

可以利用按位逻辑加(bitwise-OR)(|)对打开方式的标志值进行组合。

如打开一个新文件:

#define NEWFILE  (O_WRONLY|O_CREAT|O_TRUNC)

对访问权限位进行访问所用到的标识符,均可以通过

#include 访问到,同样可以通过|运算来对访问权限进行组合也可以直接给出数字表示如0655

#define MODE755 (S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)

注:文件的访问权限是根据:umask&~mode得出来的,例如umask=0022,mode = 0655 则访问权限为:644

测试程序:#include #include#include#include#include#include#include#include#define ERR_EXIT(m) \    do\    { \        perror(m); \        exit(EXIT_FAILURE); \    }while(0)int main(void){    umask(0);intfd;    fd= open("test.txt", O_WRONLY | O_CREAT, 0666);if (fd == -1)        ERR_EXIT("open error");    printf("open succ\n");return 0;}

测试结果一:采用默认的umask值

302bad67f9dda864b7616bad5169f95e.gif

7547481_1373552244jkel.jpg (6.38 KB, 下载次数: 0)

2013-7-12 09:08 上传

测试结果二:重新设置umask值

302bad67f9dda864b7616bad5169f95e.gif

7547481_1373552245x8KD.jpg (5.84 KB, 下载次数: 0)

2013-7-12 09:08 上传close系统调用

为了重新利用文件描述符,用close()系统调用释放打开的文件描述符

函数原型:

#include

int close(int fd);

函数参数:

-fd :要关闭的文件的文件描述符

返回值

如果出现错误,返回-1

调用成功返回0

注:若没有显示调用close(),当程序退出时也会关闭文件creat系统调用

为了维持与早期的UNIX系统的向后兼容性,Linux也提供可选的创建文件的系统调用,它称为creat()。现代的linux内核很少采用creat创建文件,因为open可以完成创建功能

函数原型:

int creat(const char *path, mode_t mode);

参数

path :文件的名称,可以包含(绝对和相对)路径

mode: 用来规定对该文件的所有者,文件的用户组及系 统中其他用户的访问权限

返回值

打开成功,返回文件描述符;

打开失败,返回-1

在UNIX的早期版本中,open()系统调用仅仅存在两个参数的形式。如文件不存在,它就不能打开这些文件。文件的创建则由单独的系统调用creat()完成。在Linux及所有UNIX的近代版本中,creat()系统调用是多余的。

creat()调用

fd = creat(file, mode);

完全等价于近代的open()调用

fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, mode);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值