@[
linux系统调用——文件操作
所谓系统调用是指操作系统提供给用户的一组“特殊”的接口,用户程序可以通过这组“特殊”的接口来获得操作系统内核提供的服务
系统调用并不直接与程序员进行交互,与程序员进行直接交互的是用户编程接口——API
问:为什么用户程序不能直接访问内核
答:资源不能的到保护,两个或多个应用程序同时访问会产生死锁现象。(内核是提供服务的,但不能直接提供用户程序,简单来说,银行是给人民服务的,人们进行存取钱的服务,不能直接从银行中存取,而是通过银行工作人员,在linux系统中扮演这个工作人员的是API)
**## 不带缓存的I/O操作**
不带缓存的I/O操作,主要会用到6个函数——creat,open,read,write,lseek和close
**creat函数**
creat函数用于建立文件
creat说明
表头文件 #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
定义函数 int creat(const char *pathname,mode_t mode)
函数说明 creat会返回新的文件描述符,错误返回-1
EEXIST参数pathname文件已经存在
EINVAL参数mode不正确
mode所能使用的旗标
S_IRUSR 可读文件
S_IWUSR 可写文件
S_IXUSR 可执行文件
S_IXRWU 可读可写可执行
**open函数**
open函数用来打开文件
open函数也能用来创建文件,具体代码如下
open(const char * pathname ,int flags,mode_t mode )
open函数使用说明
表头文件 与creat一样
定义函数 int open(const char *pathname,int flags)
int open (const char *pathname int flags,mode_t mode )
函数说明 参数pathname指想要打开的文件,
flags所能使用的旗标
O_RDONLY 以只读的方式打开
O_WRONLY 以只写的方式打开
O_RDWRS 以可读可写的方式打开
以上旗标是互斥的,不可以同时使用但是可以于下列旗标同时使用
O_CREAT 若要打开的文件不存在,则创建
O_EXCL 如果 O_CREAT也被设置,此指令会去检查文件是否存在,若不存在则创建
O_NOCTTY 如欲打开的文件是终端机设备时,则不会将该终端机当成进程控制终端机
O_TRUNC 若 文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,文件资料消失
返回值 正确返回0,错误返回-1
**close函数**
close函数用于关闭文件
close函数使用说明
表头文件 #include <stdio.h>
定义函数 int close (int fd)
函数说明 用来关闭open打开的文件
返回值 成功返回0,有错误发生时返回EOF并把错误代码报告给error
**read函数**
read函数用来从已打开的文件读取数据
功能:从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区,返回值为实际读取的字节数
read函数使用说明
表头文件 #include <unistd.h>
定义函数 int read(int fd,const void *buf,size_f length)
函数说明 read()会把参数fd所指的文件传送到count个字节到buf指针所指的内存中,若参数count为0,则
read()不会有作用并返回0,返回值为实际读取到的数值,如果返回0表示已到达文件尾或是无可
读取的数据,此外文件读写位置会随读到的字节移动
**write函数**
write函数用于将数据写入已经打开的文件
write函数使用说明
表头文件 #include <unistd.h>
定义函数 int write(int fd ,const viod *buf,size_f length)
函数说明 write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内
返回值 如果顺利,write()会返回实际写入的字节数 错误返回-1,并把代码存进error中
**lseek函数**
lseek函数是用来移动文件的读写位置
lseek函数使用说明
表头文件 #include“sys/types.h”
#include“unistd.h”
定义函数 int lseek(int fd,offset_t offset,int whence)
函数说明 每一个打开的文件,都有一个读写位置,在打开文件时通常将读写位置指向文件开头
若是以附加的方式打开文件(如O_APEND),则读写位置指向文件尾,当read()和write()
时读写位置会随之改变,lseek()便是控制文件的读写位置的,参数offset为根据参数
whence来移动读写位置的位移数,参数whence为下面的其中之一种
SEEK_SET : 参数offset为新的读写位置
SEEK_CUR : 以目前的读写位置往后增加offset个位移量
SEEK_END : 将读写位置指向文件尾再增加offset个位移量
将读写位置移动到文件开头 lseek(int fd,0,SEEK_SET)
将读写位置移动到文件尾 lseek(int fd,0,SEEK_END)
获取目前文件位置 lseek(int fd,0,SEEK_CUR)
下面是使用文件操作写一个小代码,创建一个新的文件,并在这个文件中写三个hello,一行一个hello
#include<sys/types.h>
#include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
int main ()
{
int fd;
int r_buf[6] ;
int w_buf[6] = "hello";
int bytes_read ;
int bytes_write ;
int i;
if((fd = open ("hello.txt",O_CREAT|O_RDWR,0644))<0)
{
perror("open error \n"):
exit (-1) ;
}
for (i=0 ; i< 3 ; i++)
{
if (bytes_write = write (fd,w_buf,5) < 0)
{
perror("write error\n");
exit (-1) ;
}
else
{
write(fd,"\n",1);
}
}
lseek(fd,0,SEEK_SET);
for (i=0 ; i< 3 ; i++)
{
memset(r_buf,0,5);
if ((bybes_read = read(fd,r_buf,6))< 0)
{
perror("read erro\n");
exit(-1);
}
else
{
write(1,r_buf,6);
}
}
return 0 ;
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190716154142360.png)