Linux c编程(20210605)

简介: Linux c编程(20210605)

Linux文件的基础操作

Linux中的文件是指以计算机的存储设备为载体的信息集合,就是保存在内存、磁盘等设备上的一个个由各种数据组合在一起的实体,是Linux在物理上最基本的组成单元。

Linux文件

ls命令查看目录下的文件

Linux的文件类型

通常可以分为7大类

文件类型 缩写 英文名称
普通文件 - Regular file
目录文件 D Directory file
块设备文件 B Block special file
字符设备文件 C Character special file
命名管道文件 F FIFO或者named pipe
套接字文件 S Socket
符号链接文件 l Symbolic link
  1. 普通文件不包含文件系统的结构信息,可包括图形文件、数据文件、文档文件、声音文件等按内部结构分为: 文本文件和二进制文件
  • 文本文件
    字符组成的文件,用户可以直接读到的数据,Linux系统的配置文件基本都属于这种
    可以使用cat 命令直接查看
  • 二进制文件
    按信息在内存中的格式表示的文件
    通常不能直接查看,必须使用相应的软件
    通常来说,Linux中的可执行文件基本都属于这种类型,可以运行
  1. 目录文件
    Linux中的目录也是以文件的形式存在,成为目录文件。
    用户可以读取但是不能修改目录文件的内容,只允许系统修改
    目录文件在文件名和索引节点之间的转换起到桥梁的作用,是文件系统树形文文件结构的关键。其由文件名和索引节点号构成。
    每个目录文件的前2项是2个特定的文件 : .和…,. 对应于该目录文件本身的索引节点,…对应其父目录的索引节点
  2. 字符设备文件和块设备文件Linux把设备(硬盘、串口等)也看作文件,具有相同的操作方法。这种文件被称为设备文件,是用于操作系统与IO设备提供连接的一种文件,分为字符设备文件和块设备文件,分别对应字符设备和块设备,这些文件通常存放在dev目录中。

Linux中存在一个目录 /dev/null,所有放入这一文件的设备的数据都将不存在,可以把此放入操作看成是删除。

  • 字符设备文件:是一个顺序的数据流设备文件,读写按字节进行,而且这些字符是连续地形成一个数据流。字符设备不具有缓冲区,所以对这种设备地读写是实时地,如串口终端、磁带机等。
  • 块设备文件:具有一定结构地随机存取设备文件,读写按块进行,使用缓冲区来存放暂时的数据,待条件满足后,从缓冲区一次性写入设备,或一次性读出放到缓冲区中,如磁盘和文件系统等。
  • 串口设备文件 /dev/tty
  • 硬盘设备文件 /dev/hadl
  1. 命名管道文件
    又称为先进先出文件,其主要用于在Linux的进程间传递数据,是Linux进程间的一种通信机制。
    管道是进程间传递数据的"媒介",一个进程将数据写入管道的一端,另一个进程从管道另一端读取数据。
    通常,管道是建立在高速缓冲中的。
    先进先出的处理规定。
    可以分为有名管道和无名管道。
  2. 套接字文件主要用于在不同计算机进程间的通信,是操作系统内核中的一个数据结构,是网络中的节点进行相互通信的门户。三种类型:流式套接字、数据报套接字和原始套接字
  • 流式套接字就是TCP套接字
  • 数据报套接字也就是UDP套接字
  • 原始套接字用"SOCK_RAW"表示

原始套接字允许对低层协议,如IP或ICMP进行直接访问,主要用于对新的网络协议进行测试。

  1. 符号链接文件
    又称链接文件,是一种特殊文件。
    实际上是指向一个真实存在的文件链接。
    链接文件提供了一种共享文件的方法,在链接文件中不是通过文件名实现文件共享,而是通过链接文件所包含的指向文件的指针来实现对文件的访问。
    普通用户可以建立链接文件,并通过其指针访问它所指向的那个文件。
    使用链接文件可以访问普通文件,也可以访问目录文件和不具有普通文件形态的其他文件。
    链接文件可以在不通过文件系统之间建立一种链接关系。
    根据链接对象的不同,可以分为硬链接文件和符号链接文件。

Linux的文件结构和文件描述符

Linux的文件是个简单的字节数据序列,所以在Linux下对于文本文件、二进制文件的结构和访问方法是相同的。

Linux的文件是由一系列的块组成,在同一个文件系统中块大小相同。

Linux使用文件描述符来标识一个进程正在访问的特定文件,当打开一个文件或者创建一个文件时,Linux将返回一个文件描述符,以供其他操作引用,通常来说文件描述符是一个小的非负整数。

文件描述符是对应进程的,每一个文件描述符都对应一个特定的文件,而每一个特定的文件可以对应不同的进程,存在多个不同的文件描述符。

在Linux中,每个进程都可以拥有最多1024个文件描述符,并且有自己的文件描述符表,其中前三项对于一般的进程是固定的,且是由系统自动打开的。说明如下:

  • 文件描述符0:标准输入文件,通常对应键盘等输入设备
  • 文件描述符1:标准输出文件,通常对应显示设备
  • 文件描述符2:标准错误输出文件,通常也是对应显示设备。

对于以上三个文件描述符,用户程序不用执行文件打开操作就可以直接使用,其在头文件中的定义部分:

#define STDIN_FILENO   0  //标准输入
#define STDOUT_FINENO  1  //标准输出
#define STDERR_FILENO  2  //标准错误输出
相关文章
|
4月前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
107 1
|
18天前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
18天前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
1月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
41 6
|
1月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
80 3
|
22天前
|
Shell Linux Python
python执行linux系统命令的几种方法(python3经典编程案例)
文章介绍了多种使用Python执行Linux系统命令的方法,包括使用os模块的不同函数以及subprocess模块来调用shell命令并处理其输出。
17 0
|
2月前
|
项目管理 敏捷开发 开发框架
敏捷与瀑布的对决:解析Xamarin项目管理中如何运用敏捷方法提升开发效率并应对市场变化
【8月更文挑战第31天】在数字化时代,项目管理对软件开发至关重要,尤其是在跨平台框架 Xamarin 中。本文《Xamarin 项目管理:敏捷方法的应用》通过对比传统瀑布方法与敏捷方法,揭示敏捷在 Xamarin 项目中的优势。瀑布方法按线性顺序推进,适用于需求固定的小型项目;而敏捷方法如 Scrum 则强调迭代和增量开发,更适合需求多变、竞争激烈的环境。通过详细分析两种方法在 Xamarin 项目中的实际应用,本文展示了敏捷方法如何提高灵活性、适应性和开发效率,使其成为 Xamarin 项目成功的利器。
45 1
|
2月前
|
安全 Linux 开发工具
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
|
2月前
|
Linux
揭秘Linux心脏:那些让你的编程事半功倍的主要系统调用
【8月更文挑战第31天】Linux中的系统调用是操作系统提供给应用程序的接口,用于请求内核服务,如文件操作、进程控制等。本文列举了22种主要系统调用,包括fork()、exec()、exit()、wait()、open()、close()、read()、write()等,并通过示例代码展示了如何使用fork()创建新进程及使用open()、write()、close()操作文件。这些系统调用是Linux中最基本的接口,帮助应用程序与内核交互。
33 1
|
2月前
|
Linux 程序员 开发者
源社区的兴起:从“代码隐士”到Linux引领的“全球编程嘉年华”
在编程的古老森林中,曾有“代码隐士”默默耕耘,惧怕智慧外泄。直到“开源”春风拂过,源社区如全球编程嘉年华盛开!开源文化颠覆了“独门秘籍”的传统,像“武林秘籍共享”般在网络上公开,鼓励知识传播与智慧碰撞。程序员组队开发,分享代码,提升科技实力。Linux则从“首席大厨”变身为“总导演”,以强大内核调制出诱人应用,引领潮流并推动技术创新。加入这场没有血腥厮杀,只有知识盛宴的“编程版《饥饿游戏》”吧!与全球开发者共享编程的乐趣与成就感!别忘了带上你的“独门秘籍”,可能下一个改变世界的创意就在其中!
62 7