今天继续学习文件与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. Legacy和UEFI,MBR和GPT的区别

    Legacy(历史的,遗留的,传统的)和UEFI指的是系统引导方式(Legacy为传统BIOS,UEFI为新式BIOS),MBR和GPT指的是磁盘分区表类型. 一般情况下都是Legacy+MBR, U ...

  2. 【C/C++开发】C++实现字符串替换的两种方法

    替换字符串replace() erase() //C++ 第一种替换字符串的方法用replace()|C++ 第二种替换字符串的方法用erase()和insert()[ C++string|C++ r ...

  3. NOI2019 Fe

    NFLS XY NOI2019 Fe Orz zsy,zhf,wqy,zjc,bly! Goodbye OI!

  4. java-统计一段句子中各单词出现的次数

    问题:统计一段句子中各单词出现的次数. 思路: 1.使用split方法将文章进行分割,我们这里以空格.逗号和句点为分隔符,然后存到一个字符串数组中. 2.创建一个hashMap集合,key是字符串类型 ...

  5. Mysql 学习整理

    1 创建数据库 1.1数据库基本结构 数据库:数据库是表的集合,带有相关的数据. 表:一个表是多个字段的集合. 字段:一个字段是一列数据,由字段名和记录组成 1.2创建数据库 create datab ...

  6. java email发送(附件中文的处理)

    这里使用的是commons-email-1.3.2.jar进行的开发,自认为这是简单的邮件发送. package com.yt.base.common; import java.io.Unsuppor ...

  7. spring框架学习(四)——注解方式AOP

    注解配置业务类 使用@Component("s") 注解ProductService 类 package com.how2java.service; import org.spri ...

  8. Java开发笔记(一百二十六)Swing的窗口

    前面介绍了AWT界面编程的若干技术,在编码实践的时候,会发现AWT用起来甚是别扭,它的毛病包括但不限于下列几点:1.对中文的支持不好,要想在界面上正常显示汉字,还得在运行时指定额外的运行参数“-Dfi ...

  9. REST Framework接口规范

    REST Framework接口规范 一 .发展及其背景介绍 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备-).因此,必须有一种统一的 ...

  10. 【LEETCODE】43、1002. Find Common Characters

    package y2019.Algorithm.array; import java.util.*; /** * @ProjectName: cutter-point * @Package: y201 ...