不带缓存的文件I/O 操作,首要用到5 个函数:open、read、write、lseek和close。这儿的不带缓存是指每一个函数都只调用体系中的一个函数(不理解这句话的意义)。这些函数尽管不是ANSI C的组成部分,可是是POSIX 的组成部分。
open函数语法关键
|– #i nclude // 供给类型pid_t的界说
所需头文件—-|– #i nclude
|– #i nclude
函数原型 int open(const char *pathname,flags,int perms)
pathname 被翻开的文件名(可包含路径名)
O_RDONLY:只读办法翻开文件
O_WRONLY:可写办法翻开文件
O_RDWR:读写办法翻开文件
O_CREAT:假如该文件不存在,就创立一个新的文件,并用第三个参数为其设置权限
O_EXCL:假如运用O_CREAT时文件存在,则可回来过错音讯。这一
函数传入值 参数可测验文件是否存在
O_NOCTTY:运用本参数时,如文件为终端
终端不可用open()体系调用的那个进程的操控终端
O_TRUNC:如文件现已存在,而且以只读或只写成功翻开,那么会先
悉数删去文件华夏有数据
O+APPEND:以增加办法翻开文件,在翻开文件的一起,文件指针指
向文件的结束
perms 被翻开文件的存取权限,为8进制表明法
函数回来值 成功:回来文件描述符
失利:-1
补述:文件描述符
关于Linux 而言,一切对设备和文件的操作都运用文件描述符来进行的。文件描述符
是一个非负的整数,它是一个索引值,并指向内核中每个进程翻开文件的记载表。当翻开一
个现存文件或创立一个新文件时,内核就向进程回来一个文件描述符;当需求读写文件时,
也需求把文件描述符作为参数传递给相应的函数。
一般,一个进程启动时,都会翻开3 个文件:规范输入、规范输出和规范犯错处理。这
3 个文件别离对应文件描述符为0、1 和2(也便是宏替换STDIN_FILENO、STDOUT_FILENO
和STDERR_FILENO)。
根据文件描述符的I/O 操作尽管不能移植到类Linux 以外的体系上去(如Windows),但它
往往是完成某些I/O操作的专一途径,如Linux中低级文件操作函数、多路I/O、TCP/IP套接字
编程接口等。一起,它们也很好地兼容POSIX规范,因而,能够很方便地移植到任何POSIX平
台上。根据文件描述符的I/O操作是Linux中最常用的操作之一。
read函数语法关键
所需头文件 #i nclude
函数原型 ssize_t read(int fd,void *buf,size_t count)
fd:文件描述符
函数传入值 buf:指定存储器读出数据的缓函数传入值 冲区
count:指定读出的字节数
成功:读到的字节数
函数回来值 0:已抵达文件尾
-1:犯错
write函数语法关键
所需头文件 #i nclude
函数原型 ssize_t write(int fd,void *buf,size_t count)
fd:文件描述符
函数传入值 buf:指定存储器写入数据的缓函数传入值 冲区
count:指定读出的字节数
函数回来值 成功:已写的字节数
-1:犯错
lseek函数语法关键
所需头文件 #i nclude
#i nclude
函数原型 off_t lseek(int fd,off_t offset,int whence)
fd:文件描述符
函数传入值 offset:偏移量,每一读写操作所需求移动的间隔
单位是字节的数量,可正可负(向前移,向后移)
whence: SEEK_SET:当时方位为文件的最初,新方位为偏移量的巨细
当时方位 SEEK_CUR:当时方位为文件指针的方位,新方位为当时方位加上偏移
的基点 SEEK_END:当时方位为文件的结束,新方位为文件的巨细加上偏移
函数回来值 成功:文件的当时位移
-1:犯错
/*翻开,封闭,读写文件.c*/
#i nclude unistd.h>
#i nclude sys/types.h>
#i nclude sys/stat.h>
#i nclude fcntl.h>
#i nclude stdlib.h>
#i nclude stdio.h>
int main(void)
{
int fd; //文件描述符
int i,size,len;
char *buf=Writing to this file!;
char buf_r[10];
len = strlen(buf);
/*调用open函数,以可读写的办法翻开,留意选项能够用“|”符号衔接*/
if((fd = open(/tmp/hello.c, O_CREAT | O_TRUNC | O_WRONLY , 0600 ))0){
perror(open:);
exit(1);
}
else{
printf(Open file: hello.c %d\n,fd);
}
/*调用write函数,将buf中的内容写入到翻开的文件中*/
if((size = write( fd, buf, len)) 0){
perror(write:);
exit(1);
}
else
printf(Write:%s\n,buf);
/*调用lsseek函数将文件指针移到文件开始,并读出文件中的10个字节*/
lseek( fd, 0, SEEK_SET );
if((size = read( fd, buf_r, 10))0){
perror(read:);
exit(1);
}
else
printf(read form file:%s\n,buf_r);
if( close(fd) 0 ){
perror(close:);
exit(1);
}
else
printf(Close hello.c\n);
exit(0);
}
当多个用户一起运用、操作一个文件的状况,这时,Linux 一般选用的办法是给文件上锁,来防止同享的资源发生竞赛的状况。
文件锁包含建议性锁和强制性锁。建议性锁要求每个上锁文件的进程都要查看是否有锁存在,而且尊重已有的锁。在一般状况下,内核和体系都不运用建议性锁。强制性锁是由内核履行的锁,当一个文件被上锁进行写入操作的时分,内核将阻挠其他任何文件对其进行读写操作。选用强制性锁对功能的影响很大,每次读写操作都必须查看是否有锁存在。在Linux 中,完成文件上锁的函数有lock和fcntl,其间flock用于对文件施加建议性锁,而fcntl不只能够施加建议性锁,还能够施加强制锁。一起,fcntl还能对文件的某一记载进行