今天继续学习文件与io,话不多说,开始进入正题:

文件的read和write系统调用:
说明:函数中出现在size_t和ssize_t是针对系统定制的数据类型:
 
 
下面以一个实现文件简单拷贝的示例(类似于cp命令,但是没cp命令强大),来对其文件的读写有个感性的认识:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> #include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while() int main(int argc/**参数总个数**/, char *argv[]/**具体参数值**/)
{
int infd;//读文件描述符
int outfd;//写文件描述符
if (argc != )
{
fprintf(stderr, "Usage %s src dest\n", argv[]);
exit(EXIT_FAILURE);
} infd = open(argv[], O_RDONLY);
if (infd == -)
ERR_EXIT("open src error"); if ((outfd = open(argv[], O_WRONLY | O_CREAT | O_TRUNC/**以清空的方式打开**/, )) == -)
ERR_EXIT("open dest error"); char buf[];
int nread;
  //将读入的文件内容拷贝到新文件中
while ((nread = read(infd, buf, )) > )
{
write(outfd, buf, nread);
} close(infd);
close(outfd);
return ;
}

编译运行:

对于read和write,下面再来探讨一下它们之间细微的区别:
1、read读取过程中,有可能被某些信号给中断,这个在之后的信号中断时再学习。
2、read读指定字节的数据时,如果返回值大于0,表示已经从文件中将数据读到缓冲区当中了,但是write就不一定了,当我们写入时,如果返回大于0并非代表已经将缓冲区中的数据写入到磁盘当中了,仅仅只是表示数据缓冲区已经拷到内核缓冲区了,并未同步到磁盘上,如果想立即同步到磁盘中的话,可以利用下面这个函数既时同步:
实际上,我们也可以通过给open函数,设定一个flags,来达到同步的效果:
这时写文件时,就会一直阻塞到数据缓冲区写到物理磁盘。
 
文件的随机读写:
 
说明:lseek对应于c语言fseek函数
下面用具体实例来理解一下lseek函数的用法:
实例一:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> #include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while() int main(void)
{
int fd;
fd = open("test.txt", O_RDONLY);
if (fd == -)
ERR_EXIT("open error"); char buf[] = {};
int ret = read(fd, buf, );//从文件中读取5个字节,这时文件指针就会偏移到5的位置
if (ret == -)
ERR_EXIT("read error");
printf("buf=%s\n", buf); ret = lseek(fd, , SEEK_CUR);//通过从当前文件的偏移值计算偏移,偏移量为0,就能计算文件当前的偏移量
if (ret == -)
ERR_EXIT("lseek"); printf("current offset=%d\n", ret);
return ; }

首先我们创建一个test.txt,以便进行程序测试:

编译运行:

实例二:利用lseek产生空洞文件
首先先了解下什么是空洞文件:
好了,下面用程序进行说明:
编译运行:
 
我们来查看一下它的内容:
这时,采用另外一个命令:
 
这时,我们查看一下其大小:
 
这时,为了说明空洞内容是没有存放在磁盘中的,这时,我们将偏移量加大:
编译运行,来查看下内容大小:
总结:
一个文件的大小不等于一个文件在磁盘所占用的空间,下面再来简单说明下:
 
目录访问:
说明:struct dirent目录信息结构体的核心结构如下:
下面以一个具体示例来使用上面的这些目录函数【功能跟ls命令类似,简易版】
编译运行:
如果想过滤掉隐藏文件,则可以修下代码如下:
再次运行:
 
下面还有一些命令函数,比较简单,这里就不练习了,贴出来参考:
mkdir:
rmdir:
chmodfchmod:
 
chownfchown:
 
好了,今天的内容学到这,下回见!

linux系统编程之文件与io(二)的更多相关文章

  1. linux系统编程之文件与io(一)

    经过了漫长的学习,C语言相关的的基础知识算是告一段落了,这也是尝试用写博客的形式来学习c语言,回过头来看,虽说可能写的内容有些比较简单,但是个人感觉是有史起来学习最踏实的一次,因为里面的每个实验都是自 ...

  2. linux系统编程之文件与io(五)

    上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这 ...

  3. linux系统编程之文件与io(四)

    今天继续学习文件与io,主要是学习文件共享及文件.复制文件描述符,有点抽象,主要是概念上的理解,但是很重要,下面一一来分解: 文件共享: 回顾一下,在linux系统调用中,是通过文件描述符来访问文件的 ...

  4. linux系统编程之文件与IO(二):系统调用read和write

    read系统调用 一旦有了与一个打开文件描述相连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节 函数原型: #include &l ...

  5. linux系统编程之文件与IO(一):文件描述符、open,close

    什么是IO? 输入/输出是主存和外部设备之间拷贝数据的过程 设备->内存(输入操作) 内存->设备(输出操作) 高级I/O ANSI C提供的标准I/O库称为高级I/O,通常也称为带缓冲的 ...

  6. linux系统编程之文件与IO(七):时间函数小结

    从系统时钟获取时间方式 time函数介绍: 1.函数名称: localtime 2.函数名称: asctime 3.函数名称: ctime 4.函数名称: difftime 5.函数名称: gmtim ...

  7. linux系统编程之文件与IO(三):利用lseek()创建空洞文件

    一.lseek()系统调用 功能说明: 通过指定相对于开始位置.当前位置或末尾位置的字节数来重定位 curp,这取决于 lseek() 函数中指定的位置 函数原型: #include <sys/ ...

  8. linux系统编程之文件与IO(八):文件描述符相关操作-dup,dup2,fcntl

    本节目标: 1,文件共享 打开文件内核数据结构 一个进程两次打开同一个文件 两个进程打开同一个文件 2,复制文件描述符(dup.dup2.fcntl) 一,文件共享 1,一个进程打开两个文件内核数据结 ...

  9. linux系统编程之文件与IO(四):目录访问相关系统调用

    1. 目录操作相关的系统调用     1.1 mkdir和rmdir系统调用     1.1.1 实例     1.2 chdir, getcwd系统调用     1.2.1 实例     1.3 o ...

随机推荐

  1. [LeetCode] 202. Happy Number 快乐数

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  2. [LeetCode] 210. Course Schedule II 课程安排II

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  3. Mybatis获取数据库自增主键

    一般我们都为将表中主键列设置为自增,当我们执行插入语句时,比如这样 //测试添加 Employee employee = new Employee(null, "jerry4",n ...

  4. leetcode 55 Jump Game 三种方法,回溯、动态规划、贪心

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  5. 【转】Fuel-Openstack的搭建(一)

    原文链接:https://blog.csdn.net/qq_35180983/article/details/82181496 2.1安装前的准备操作: 首先,我们需要准备以下操作: 2.1.1 下载 ...

  6. Git的各种工作流

    Git工作流可以理解为团队成员遵守的一种代码管理方案,在Git中有以下几种常见工作流: 集中式工作流 功能开发工作流 Gitflow工作流 Forking工作流 1)集中式工作流 这种工作方式跟svn ...

  7. 罗辑思维首席架构师:Go微服务改造实践

    转自:http://www.infoq.com/cn/news/2018/05/luojisiwei 方圆 曾先后在 Cisco,新浪微博从事基础架构研发工作.十多年一直专注于后端技术的研发,在消息通 ...

  8. 神奇 指令 chattr

    转自:https://www.cnblogs.com/ftl1012/p/chattr.html 常见命令参数 A:即Atime,告诉系统不要修改对这个文件的最后访问时间. S:即Sync,一旦应用程 ...

  9. Spring MVC 问题归纳

    记录一些在Spring MVC配置中出现的问题 一.配置tomcat包没有加载 错误: idea调试web项目时出现:java.lang.ClassNotFoundException:org.spri ...

  10. [SOJ #537]不包含 [CF102129I]Incomparable Pairs(2019-8-6考试)

    题目大意:给定一个长度为$n$的字符串$s$,求有多少个无序字符串二元组$(x,y)$满足:$x,y$是$s$的字串,且$x$不是$y$的字串,$y$不是$x$的字串 题解:发现满足$x,y$是$s$ ...