基于Linux的I/O操作

Linux文件的I/O编程

Linux中文件及文件描述符简介

  • 在Linux中对目录和涉笔的操作都等同于文件的操作
  • Linux中的文件主要有以下4种:普通文件、目录文件、连接文件和设备文件
  • 在Linux下,所有对设备和文件的操作都使用文件描述符来进行的
  • 一个进程的启动,一般伴随三个文件的打开:标准输入(STDIN_FILENO)、标准输出(STDOUT_FILENO)、标准错误(STDERR_FILENO)

基本I/O操作函数——>不带缓存:

  • open、read、write、lseek以及close

    • open、close函数

      • open函数用于打开或创建文件,可以同时指定属性
      • close函数用于关闭打开的文件
      • 语法格式:
        头文件:
            #include<sys/types.h>
            #include<sys/stat.h>
            #include<fcntl.h>
            #include<unistd.h>
        
      • open函数:
        int open(const char *pathname, flags, int perms);
        pathname:被打开的文件名(可包含路径)
        flag(打开方式):(常用方式)
            O_RDONLY:只读方式
            O_WRONLY:可写方式
            O_RDWR:读写方式
            O_CREATE:如果文件不存在,就创建一个新的文件,并用第三个参数为其设置权限
            --------------------------------
            O_EXCL:用于测试文件是否存在
            O_TRUNC:如果文件已经存在,并且以只读或只写成功打开,那么会先全部删除文件中原有数据
            O+APPEND:以添加的方式打开文件,打开时,文件指针指向文件的末尾
        perms:被打开文件的存取权限,为8禁止表示法
        flag参数可以通过"|"连接多个组合形式
        返回值:
            成功返回文件描述符,失败返回-1
        
      • close函数:
        int close(int fd);
        fd:文件描述符
        返回值:
            成功返回0,失败返回-1
        
    • 如:mathod_01.c
      #include <sys/types.h>
      #include <unistd.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <stdlib.h>
      #include <stdio.h>
      
      int main(void){
          int fd;     //定义文件描述符
          //调用open函数,以可读写的方式打开,使用“|”符号链接
          if((fd=open("/home/my/myTest.c", O_CREATE | O_TRUNC | O_RDWR, 0666)) < 0){
              perror("open:");    //打印出错信息
              exit(1);
          }else{
              //注意:open函数返回的文件描述符一定是最小的未用文件描述符
              printf("Open file:myTest.c %d\n", fd);
          }
      
          if(close(fd) <0){
              perror("close:");
              exit(1);
          }else{
              printf("Close myTest.c\n");
          }
          exit(0);
      }
      
    • read、write及lseek函数
      • 函数作用:

        • read:从指定的文件描述符中读出数据
        • write:用于向打开的文件写入数据,写操作从文件的当前位移量处开始,超出则返回失败
        • lseek:用于在指定的文件描述符中将文件指针定位到相应的位置
      • 语法格式:
        • 头文件

          #include<unistd.h>
          #include<sys/types.h>
          
        • read函数
          ssize_t read(int fd, void *buf, size_t count);
          fd:文件描述符
          buf:指定存储器读出数据的缓冲区
          count:指定读出的字节数
          返回值:成功返回读到的字节数;0表示读到文件尾;-1表示出错
          
        • write函数
          ssize_t write(int fd, void *buf, size_t count);
          fd:文件描述符
          buf:指定存储器写入数据的缓冲区
          count:指定写入的字节数
          返回值:成功,返回已写字节数;失败,返回-1
          
        • lseek函数
          off_t lseek(int fd, off_t offset, int whence);
          fd:文件描述符
          offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量。可正(前移)可负(后移)
          whence(当前位置的基点):
              SEEK_SET:当前位置为文件的开头,新位置为便宜量的大小
              SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量
              SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小
          返回值:成功,返回当前位移;失败返回-1
          
    • 如:method_02.c
      #include <unistd.h>
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <stdlib.h>
      #include <stdio.h>
      #include <string.h>
      
      #define MAXSIZE
      
      int main(void){
          int i, fd, size, len;
          char *buf = "Hello! Welcom to Linux World!";
          char buf_read[10];
          len = strlen(buf);
          //打开文件并制定权限
          if((fd = open("/home/my/myTest.c", O_CREAT | O_TRUNC | O_RDWR, 666)) < 0 ){
              perror("Open:");
              exit(1);
          }else{
              printf("open file:myTest.c\n", fd);
          }
      
          //write函数将buf中的内容写入到打开的文件中
          if((size = write(fd, buf, len)) < 0){
              perror("write:");
              exit(1);
          }else{
              printf("Write:%s\n", buf);
          }
      
          //调用lseek函数移动指针,并调用read读取文件
          lseek(fd, 0, SEEK_SET);
          if((size = read(fd, buf_read, 10)) < 0){
              perror("read:");
              exit(0);
          }else{
              printf("read from file:%s\n", buf_read);
          }
      
          //关闭close()
          if(close(fd) < 0){
              perror("close:");
              exit(1);
          }else{
              printf("Close myTest.c\n");
          }
          exit(0);
      }
      
  • fcntl函数:操作文件描述符的特性
    • 函数格式

      • 头文件

        #include <sys/types.h>
        #include <unistd.h>
        #include <fcntl.h>
        
      • 函数原型:
        int fcntl(int fd, int cmd, struct flock *lock);
        fd:文件描述符
        cmd:(常见的有以下几个)
            F_DUPFD:复制文件描述符
            F_GETFL:得到open设置的标志
            F_SETFL:改变open设置的标志
            F_GETTFK:根据lock描述,决定是否上文件锁
            F_SETFK:设置lock描述的文件锁
            F_SETOWN:设置进程号或进程组号
        lock:设置记录锁的具体状态
            lock的结构:
                struct flock{
                    short l_type;       //取值:F_RDLCK(读取锁→共享锁)、F_WRLCK(写入锁→排斥锁)、F_UNLCK(解锁)
                    short l_start;      //相对位移量(字节)
                    short l_whence;
                    off_t l_len;        //加锁区域长度
                    pid_t l_pid;
                }
        返回值:成功,返回0,;失败返回-1
        

标准I/O开发——>基于缓冲

  • 目的:

    减少使用read与write调用的数量

  • 三种类型的缓冲存储:
    • 全缓冲

      当填满标准I/O缓存后才进行实际的I/O操作。

    • 行缓冲

      当输入和输出有新的行符时,标准I/O库执行I/O操作。

    • 不带缓冲

      不对字符进行缓冲,如:能够尽快显示错误信息

  • 打开与关闭文件
    • 打开文件标准函数:fopen、fdopen、freopen,返回一个指向FILE的指针

      • fopen:指定打开文件的路径和模式
      • fdopen:指定打开的文件描述符合模式
      • freopen:可指定打开的文件、模式、指定特定IO流
    • 函数格式定义
      • 头文件

        #include<stdio.h>
        
      • fopen、fdopen、freopen
        FILE* fopen(const char* path, const char* mode);
        FILE* fdopen(int fd, const char* mode);
        FILE* freopen(const char* path, const char* mode, FILE* stream);
        path:包含要打开的文件的路径及文件名
        fd:要打开的文件描述符
        mode:文件打开状态,取值:
            r/rb:打开只读文件,文件必须存在
            r+/r+b:打开可读写文件,文件必须存在
            w/wb:打开只写文件,覆盖的方式(会清空存在的文件内容)
            w+/w+b:打开可读写文件,覆盖的方式
            a/ab:附加的当时打开只写文件,添加方式(在文件内容后添加内容)
            a+/a+b:附加的当时打开读写文件,添加方式
        stream:已打开的文件指针
        返回值:成功,返回指向FILE的指针,失败返回NULL
        
    • 关闭文件函数:fclose
      • 功能:缓冲区内的数据写入文件中,并释放文件资源
      • 格式:
        int fclose(FILE* stream);
        stream:已打开的文件指针
        返回值:成功:0,失败:EOF
        
    • 如:
      #include<stdio.h>
      int main(void){
          FILE *fp;
          //调用fopen函数
          fp = fopen("/home/test/hello.c", "w");
          if(fp != NULL){
              printf("Open Success!");
          }
          //关闭文件指针
          fclose(fp);
      }
      
  • 文件的读与写
    • 头文件:

      #include <stdio.h>
      
    • 读文件:fread函数
      • 格式:

        size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
        ptr:存放读入记录的缓冲区
        size:读取的记录大小
        nmemb:读取的记录数
        stream:要读取的文件流
        返回值:成功,返回实际读到的nmemb,失败返回EOF
        
    • 写文件:fwrite函数
      • 格式

        size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
        ptr:存放写入记录的缓冲区
        size:写入的记录大小
        nmemb:写入的记录数
        stream:要写入的文件流
        返回值:成功,返回实际写入的nmemb数目,失败返回EOF
        
    • 如:
      #include <stdio.h>
      int main(void){
          FILE *stream;
          char str[5] = {‘H‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘};
          //先打开文件
          stream = fopen("test", "w");
          int number = fwrite(str, sizeof(char), nmemb, stream);
          printf("number = %d", number);
          //关闭文件流
          fclose(stream);
      }
      
时间: 2024-08-30 15:49:22

基于Linux的I/O操作的相关文章

基于linux的web服务器的iptables防火墙安全优化设置

安全规划:开启 80  22 端口并 打开回路(回环地址 127.0.0.1) #iptables –P INPUT ACCEPT #iptables –P OUTPUT ACCEPT #iptables –P FORWARD ACCEPT 以上几步操作是为了在清除所有规则之前,通过所有请求,如果远程操作的话,防止远程链接断开. 接下来清除服务器内置规则和用户自定义规则: #iptables –F #iptables -X 打开ssh端口,用于远程链接用: #iptables –A INPUT

基于linux与busybox的reboot命令流程分析

http://www.xuebuyuan.com/736763.html 基于Linux与Busybox的Reboot命令流程分析 *************************************************************************************************************************** 作者:EasyWave                                                

基于Linux的OJ系统的设计与开发(一)

最近在研究基于linux的OJ系统,然后想自己写一系列文章记录自己这段时间的学习成果. 首先,从原理上讲,OJ功能实现并不难,最主要解决的是安全性问题.总结一下,而安全性方面问题主要是用户可能提交恶意不友好的代码.关于如何过滤这些不安全的代码,我从网上收集整理了许多资料,大体上思路如下: 先说错误的做法: 1.所有的字符串过滤都是不靠谱儿的,坑人坑自己,C语言强大的宏几乎没有绕不过的字符串过滤,而且误伤也是很常见的,比如,你在程序里要是不小心定义一个叫做fork的变量,那么你的程序别指望可以AC

基于linux和php的稳定的分布式数据采集架构

数据采集对于一些网站至关重要,在开发这种采集程序时会遇到如下一些问题:一.单进程采集慢,采集任务的间隔时间无法控制.二.数据下载部分和分析部分不分离导致可移植性不强,调试困难.三.采集程序受机器性能瓶颈和网速瓶颈限制.四.遭受数据源的封锁.等等....这就要求采集程序必须足够智能化,有如下几点要求:一.可以多机器分布运行,以适应大量数据的采集.二.能够多并发采集,使采集任务的运行周期可控.三.下载程序和分析程序分离,不仅是程序上的分离,也需要机器上的分离.四.能够很容易的加入新的采集任务,很容易

基于Linux平台下网络病毒Caem.c源码及解析

Came.c型病毒在这里主要修改了用户的密码,同时对用户的终端设备进行了监视.希望与大家共同交流 转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢 #define HOME "/" #define TIOCSCTTY 0x540E #define TIOCGWINSZ 0x5413 #define TIOCSWINSZ 0x5414 #define ECHAR 0x1d #define PORT 39617 #define BU

基于linux系统nagios安装介绍(一)

基于linux系统nagios安装介绍(一) 实验环境: (1)虚拟机操作系统:Centos6.7 32位 (2)nagios安装包:nagios-3.5.1-1.el6.i686 (3)nagios服务器端ip:192.168.100.120 (4)nagios客户端ip:192.168.100.113(即被监控端) nagios介绍: 是一个开源软件,可以监控网络设备网络流量. Linux/windows 主机状态,甚至可以监控打印机.它可以运行在 Linux 上或 windows 上,基于

基于LINUX的多功能聊天室

原文:基于LINUX的多功能聊天室 基于LINUX的多功能聊天室 其实这个项目在我电脑已经躺了多时,最初写完项目规划后,我就认认真真地去实现了它,后来拿着这个项目区参加了面试,同样面试官也拿这个项目来问我,当然我是做过一遍了,而且为了面试,我将什么strcpy,strlen等最常用的函数都自己实现了一遍,说着,我感觉自己有点挺用功的样子呢! 后来,工作也定下来了,等三方,然后继续帮助我的导师做项目,经过老师的威逼利诱下,我屈服了,又把智能家居系统作为项目,同时也是我的毕业设计,而且功能还要十分完

基于Linux 3.0.8 Samsung FIMC(S5PV210) 的摄像头驱动框架解读

作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 FIMC这个名字应该是从S5P100开始出现的,在s5pv210里面的定义是摄像头接口,但是它同样具有图像数据颜色空间转换的作用.而exynos4412对它的定义看起来更清晰些,摄像头接口被定义为FIMC-LITE .颜色空间转换的硬件结构被定义为FIMC-IS.不多说了,我们先来看看Linux3.0.8 三星的BSP包中与fimc驱动相关的文件. 上面的源码文件组成了整个fimc的驱动框架.通

linux基础学习笔记——操作大全

作者:liaoyi 更新时间:2014-6-2 ****************基本操作***************** 关机 shutdown -h now    root用户               init 0              root用户halt      root+一般用户poweroff 重启shutdown -r now    root用户init6     root用户reboot            root+一般用户 注意:1.shutdown 比较灵活,可