LINUX打开文件

Wesley13
• 阅读 589

基于文件描述符的文件操作(非缓冲)

1、文件描述符
内核为每个进程维护一个已打开文件的记录表,文件描述符是一个较小的正整数(0—1023),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读、写、创建、删除等操作。常用基于文件描述符的函数有open(打开)、creat(创建)、close(关闭)read(读取)write(写入)、ftruncate(改变文件大小)、lseek(定位)、fsync(同步)、fstat(获取文件状态)、fchmod(权限)、flock(加锁)、fcntl(控制文件属性)、dup(复制)、dup2、select和ioctl。基于文件描述符的文件操作并非ANSI C的函数,是LINUX独有的东西。

如果不清楚某个函数的具体实现形式,可以通过下面的方式查询
man  函数名  查看该函数的帮助
2、打开、创建和关闭文件

open和creat都能打开和创建函数,原型为

#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);    //文件名  打开方式  权限,open()函数出错时返回-1
int creat(const char \*pathname, mode\_t mode);              //文件名  权限   //现在已经不常用了(因为有上面的函数)
creat函数等价于→open(pathname,O\_CREAT|O\_TRUNC|O\_WRONLY,mode);

flags和mode都是一组掩码的合成值,flags表示打开或创建的方式,必须加上打开方式,mode表示文件的访问权限。

flags
的可选项有:
掩码 含义
O\_RDONLY 只读的方式打开
O\_WRONLY 方式打开
O\_RDWR 读写的方式打开
O\_CREAT 如果文件不存在,则创建文件
O\_EXCL 仅与O\_CREAT连用,如果文件已存在,则强制open失败
O\_TRUNC 如果文件存在,将文件的长度截至0
O\_APPEND 追加的方式打开文件每次调用write时,文件指针自动先移到文件尾,用于多进程写同一个文件的情况。
O\_NONBLOCK 非阻塞方式打开,无论有无数据读取或等待,都会立即返回进程之中。
O\_NODELAY 非阻塞方式打开
O\_SYNC 同步打开文件,只有在数据被真正写入物理设备设备后才返回

mode
的可选项有:
S\_IRWXU 00700 权限,代表该文件所有者具有可读、可写及可执行的权限。
S\_IRUSR 或S\_IREAD,00400权限,代表该文件所有者具有可读取的权限。
S\_IWUSR 或S\_IWRITE,00200 权限,代表该文件所有者具有可写入的权限。
S\_IXUSR 或S\_IEXEC,00100 权限,代表该文件所有者具有可执行的权限。
S\_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。
S\_IRGRP 00040 权限,代表该文件用户组具有可读的权限。
S\_IWGRP 00020权限,代表该文件用户组具有可写入的权限。
S\_IXGRP 00010 权限,代表该文件用户组具有可执行的权限。
S\_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。
S\_IROTH 00004 权限,代表其他用户具有可读的权限
S\_IWOTH 00002权限,代表其他用户具有可写入的权限。
S\_IXOTH 00001 权限,代表其他用户具有可执行的权限。
但是通常采用直接赋数值的形式,如:
int fd=open(argv\[1\],O\_CREAT|O\_RDONLY,0666);
注意:LINUX中基于文件描述符的 open 函数,对于一个不存在的文件,不能通过 O\_WRONLY 的方式打开,必须加上 O\_CREAT 选项。

close用于文件的关闭:
int close(int fd); //fd表示文件描述词,是先前由open或creat创建文件时的返回值
文件使用完毕后,应该调用close关闭它,一旦调用close,则该进程对文件所加的锁全都被释放,并且使文件的打开引用计数减1,只有文件的打开引用计数变为0以后,文件才会被真正的关闭

//o\_creat.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc,char \*\* argv)
{
        int fd = open(argv\[1\],O\_CREAT|O\_RDONLY,0666);
        printf("ret = %d\\n",ret);
        close(fd);
        return 0;
}

//(创建文件默认减去掩码0002)LINUX打开文件

open 函数中的fiags (O\_RDWR|O\_CREAT|O\_EXCL)表示在创建文件时不确定系统有没有人创建过这个文件,就加上O\_EXCL,表示如果系统存在相应文件就强制失败


点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
C++面向对象实现封装线程池
<htmlxmlns"http://www.w3.org/1999/xhtml"<head<stylebody,table{fontfamily:微软雅黑;fontsize:13.5pt}table{bordercollapse:collapse;border:solidgray;borderwidth:2px
Stella981 Stella981
2年前
AVR 嵌入式单片机芯片的中断系统介绍
<htmlxmlns"http://www.w3.org/1999/xhtml"<head<stylebody,table{fontfamily:微软雅黑;fontsize:13.5pt}table{bordercollapse:collapse;border:solidgray;borderwidth:2px
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
LINUX中文件描述符传递
<htmlxmlns"http://www.w3.org/1999/xhtml"<head<stylebody,table{fontfamily:微软雅黑;fontsize:10pt}table{bordercollapse:collapse;border:solidgray;borderwidth:2px0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这