Linux文件操作函数open,文件系统调用函数open

//fileopen.c

文本描述符,非负整数。当为负数时(日常是-1),代表张开/成立文件出错。
其间文件汇报暗中认可值如下:
/* Standard file descriptors.  */
#define STDIN_FILENO0/* Standard input.  */
#define STDOUT_FILENO1/* Standard output.  */
#define STDERR_FILENO2/* Standard error output.  */

我们日常要求在Linux中开始展览文件操作,明天自家就来共享下文件操效率到的部分函数
Linux文件操作函数open,文件系统调用函数open。1 open
所需头文件:
图片 1

Linux系统中操作文件有二种办法,一种是规范C的文书试行函数,一般以f初始,fopen,fread,fwrite等等,这种操作实施是带缓存的,一般系统会对它进行优化,其他一种是系统调用,open,
close, read, write,
lseek,也正是我们今日要享用的,这种不带缓存,直接读和写都以实在的数目,一般在驱动中供给用到这种方式,这一篇先来分享系统调用的多少个函数,下一节再享受标准C的文本操作函数
http://www.linuxidc.com/Linux/2016-11/137613.htm。

#include<stdio.h>

文件IO函数,普通满含 open,read,write,lseek,close那多个函数。
再有creat函数,不过未来用open已经得以完全代替creat。
creat = open  + oflag(O_WRONLY|O_CREAT|O_TRUNC)

函数原型:int open(const char *pathname,flags,int perms)
pathname:被展开的公文名,可含蓄路线
flag :文件展开的形式,参数可以透过“|” 组合构成,但前3
个参数不能够相互重合。
O_REONLY :只读方式展开文件
O_WRONLY :可写格局张开文件
O_福特ExplorerDWLX570 :读写格局张开文件
O_CREAT
:假如文件不设临时就创办贰个新文件,并用第八个参数为其设置权限。
O_EXCL :即便使用O_CREAT
时文件存在,则可重回错误新闻。这一参数可测量检验文件是还是不是留存。
O_NOCTTY :使用本参数时,如文件为巅峰,那么极端不得以当作调用open
()系统调用的特别进程的决定终端。
O_TRUNC
:如文件已经存在,况兼以只读或只写成功展开,那么会先全体删减文件中原因数据。
O+APPEND
:以加多格局展开文件,在开垦文件的同时,文件指针指向文件末尾。
perms:权限,能够用数字代表

1 open
所需头文件:
图片 2

#include<string.h>

int open(const char *pathname , int oflag, mode_t mode);//其中mode_t 是unsigned int类型
打开pathname文件
内部oflag的咬合:第一组必选其一,第二组任选[0-n]个。
第一组:文件的展开药方式
O_RDONLY    //只读
O_WRONLY   //只写
O_RDWR       //读写
第二组:别的接纳
O_APPEND   //将当前偏移量指向文件末尾,不然开端值为0
O_CREAT
O_EXCL
O_TRUNC
O_NOCTTY
O_NONBLOCK
O_DSYNC
O_RSYNC
O_SYNC

重回值,成功再次回到文件描述符,失利再次回到-1

函数原型:int open(const char *pathname,flags,int perms)
pathname:被打开的文本名,可含蓄路线
flag :文件打开的点子,参数能够透过“|” 组合构成,但前3
个参数不可能相互重合。
O_REONLY :只读形式张开文件
O_WRONLY :可写格局展开文件
O_RDW安德拉 :读写情势展开文件
O_CREAT
:要是文件子虚乌有时就创设三个新文件,并用第多个参数为其安装权限。
O_EXCL :尽管使用O_CREAT
时文件存在,则可回到错误音讯。这一参数可测验文件是或不是存在。
O_NOCTTY :使用本参数时,如文件为终端,那么极端无法看作调用open
()系统调用的不胜进程的支配终端。
O_TRUNC
:如文件已经存在,并且以只读或只写成功开辟,那么会先全部刨除文件中原原本本的经过数据。
O+应用程式END
:以增加格局张开文件,在展开文件的还要,文件指针指向文件末尾。
perms:权限,能够用数字代表

#include<sys/types.h>

int close(int filedes);

2 close
函数原型:int close (int fd )
函数输入值:fd :文件陈述符
函数再次回到值:成功:0 出错:-1

再次来到值,成功重返文件描述符,退步重回-1

#include<sys/stat.h>

关门钦命文件

来看个例子:
图片 3
先让用户输入七个文件,以可读可写的法子展开,借使子虚乌有就创办,权限是0666
图片 4
hello就是新成立的文书
小编们看下hello的权位
图片 5
而不是0666,而是0644,那是因为umask,umask大家前面总括过了
图片 6
是相剪的结果,大家得以在代码中钦赐umask的值为0000,那么我们创造的那么些hello就是没有错的权杖了
图片 7
再来试下
图片 8
咱俩看到前天hello的权位便是0666了

2 close
函数原型:int close (int fd )
函数输入值:fd :文件叙述符
函数再次回到值:成功:0 出错:-1

#include<fcntl.h>

off_t lseek(int filedes, off_t offset, int whence);
修改文件当前线指挥部针偏移量,成功重临施行到位后新的文本偏移量,失利再次回到-1;
whence取值如下:
SEEK_SET:从文件开端处(偏移量为0处);
SEEK_CU奥迪Q5:从当前偏移量处;
SEEK_END:从文件结尾处;
据此类似ftell函数的效用(获取当前偏移量)能够用lseek(fd, 0,
SEEK_CUR);实现。

3 read
所需头文件:
图片 9
函数原型:ssize_t read(int fd,void *buf,size_t count)
fd: 文件汇报符
Buf :钦赐期存款款和储蓄器读出多少的缓冲区
Count :钦赐读出的字节数
函数再次回到值:成功:读出的字节数 0 :已达到文件尾 -1 :出错

来看个例证:
图片 10
先让用户输入贰个文书,以可读可写的主意张开,要是不真实就创制,权限是0666
图片 11
hello正是新成立的公文
我们看下hello的权柄
图片 12
并非0666,而是0644,那是因为umask,umask大家近年来线总指挥部结过了
图片 13
是相剪的结果,我们能够在代码中钦命umask的值为0000,那么我们创制的那些hello正是不易的权限了
图片 14
再来试下
图片 15
小编们看出现在hello的权能正是0666了

#include<unistd.h>

ssize_t read (int fd, void *buf, size_t nbytes);
读取描述符fd所指向文件,读取到的源委寄存到buf中,读取nbytes字节。

看例子:
图片 16
大家先创制贰个read.txt,随意写点内容
图片 17
图片 18
memset是分配内存空间

3 read
所需头文件:
图片 19
函数原型:ssize_t read(int fd,void *buf,size_t count)
fd: 文件陈诉符
Buf :钦点期存款款和储蓄器读出多少的缓冲区
Count :内定读出的字节数
函数再次来到值:成功:读出的字节数 0 :已达到文件尾 -1 :出错

int main()

ssize_t write (int fd, const void *buf, size_t nbytes);
向描述符fd所指向文件写入从buf中读取的数码,共写入nbytes字节。

4 write
所需头文件
图片 20
函数原型: ssize_t write(int fd,void *buf,size_t count)
函数字传送入值:
fd: 文件叙述符
Buf :钦点期存款储器写入数据的缓冲区
Count :钦定读出的字节数
函数重返值:成功:已写的字节数 -1 :出错

看例子:
图片 21
咱俩先成立一个read.txt,随意写点内容
图片 22
图片 23
memset是分配内部存款和储蓄器空间

{

再次来到值汇总:
open,成功再次回到非负数文件描述符,退步再次来到-1;
close,成功再次来到0,退步重返-1;
lseek,成功再次回到施行到位后新的公文偏移量,退步再次来到-1;
read,成功再次回到读取到的字节数,退步重返-1;
write,成功重临成功写入字节数,退步重临-1;

例子:
图片 24

4 write
所需头文件
图片 25
函数原型: ssize_t write(int fd,void *buf,size_t count)
函数字传送入值:
fd: 文件汇报符
Buf :钦赐期存款款和储蓄器写入数据的缓冲区
Count :内定读出的字节数
函数再次回到值:成功:已写的字节数 -1 :出错

‍ char temp[]=”hello,abc!”;

其他:
闭馆一个文本时,还有大概会放出该进程加在该文件上的具有记录锁。
当叁个进度终止时,内核自动关闭它抱有展开的文本。

图片 26

例子:
图片 27

int fd;

图片 28

5 lseek
所需头文件
图片 29
函数原型:off_t lseek(int fd,off_t offset,int whence)
函数字传送入值:
fd: 文件叙述符
Offset
:偏移量,每一读写操作所要求活动的相距,单位是字节的多寡,可正可负(向前移,向后移)
Whence :当前地点的主心骨:
SEEK_SET :当前地方为文件开端,新任务为偏移量的大大小小
SEEK_CU宝马X3 :当前地点为文件指针地点,新职分为当下岗位加上偏移量
SEEK_END :当前岗位为文件的终极,新职分为文件的大大小小加上偏移量大小

图片 30

char pathname[255];

例子:
图片 31

5 lseek
所需头文件
图片 32
函数原型:off_t lseek(int fd,off_t offset,int whence)
函数字传送入值:
fd: 文件陈说符
Offset
:偏移量,每一读写操作所急需活动的离开,单位是字节的数码,可正可负(向前移,向后移)
Whence :当前岗位的着重:
SEEK_SET :当前岗位为文件开首,新岗位为偏移量的分寸
SEEK_CU凯雷德 :当前岗位为文件指针地点,新职分为近日职分加上偏移量
SEEK_END :当前任务为文件的末段,新任务为文件的分寸加上偏移量大小

if((fd=open(“fileopen.txt”,O_WRONLY|O_CREAT,0640))==-1)

图片 33

例子:
图片 34

{

好了,Linux open close read write
lseek的采取就总计到此处,如不日常,接待指正,谢谢。

图片 35

printf(“creat file wrong!”);

本文恒久更新链接地址:http://www.linuxidc.com/Linux/2016-11/137499.htm

下边大家用四个大的事例把地点分享的事物串起来:
读三个文件的全体内容,写入到另外二个文书
先看看file.in的内容
图片 36

}

图片 37

图片 38

int len=strlen(temp)+1;

图片 39

write(fd,temp,len);//若fd为0,或这里直接写0,则会输出到显示器上而不写入文件中

6 perror
貌似境遇错误的时候,系统会把错误报错在全局变量errorno中,我们能够用perror打字与印刷出切实可行的报错新闻,perror函数中的字符串约等于题目,看个例子
图片 40

close(fd);

图片 41

}

好了,Linux 文件系统调用函数open close read write lseek
perror就总括到这里,如有失水准,招待指正,谢谢。

 

正文长久更新链接地址:http://www.linuxidc.com/Linux/2016-11/137612.htm

//fileopen2.c

图片 42

#include<sys/types.h>

#include<sys/stat.h>

#include<unistd.h>