linux系统调用——文件操作(一)

@[

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)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值