《UNIXLinux程序设计教程》一2.1 UNIX 输入输出基本概念

2.1 UNIX 输入输出基本概念

在任何一种操作系统中,程序开始读写一个文件的内容之前,必须首先在程序与文件之间建立连接或通信通道,这一过程称为打开文件。打开一个文件的目的可能是要读其中的数据,也可能是要往其中写入数据,还可能是既要读又要写数据。
UNIX系统有两种机制用于描述程序与文件的这种连接:一种称为文件描述字,另一种称为流。因此,系统中关于I/O的函数也分为两大类:一类针对文件描述字操作,另一类针对流操作。
当用流或描述字I/O函数打开一个文件时,它们分别返回一个流或文件描述字,然后便可以将这个流或文件描述字作为参数传递给相应读写函数来完成实际的读写操作。
当已完成对文件的读写之后,可以通过关闭文件而终止程序与文件的这种连接。一旦关闭了一个文件描述字或者一个流,就不能再对它进行输入输出。

  1. 文件描述字与流
    UNIX系统中,文件描述字表示为int类型的对象,而流表示为指向类型为FILE结构的指针。文件描述字函数多数是系统调用,它们提供底层基本的输入输出操作接口。当需要对特定设备进行控制操作时,往往必须使用文件描述字,流函数不能够进行这类操作。另外,如果程序需要按特殊方式进行输入输出(如非阻塞输入),也必须使用文件描述字。

流函数建立在文件描述字之上,通过文件描述字函数而实现,它给程序提供了更高一级的输入输出接口。流函数比对应的文件描述字函数更丰富,功能更强大,也更利于程序的移植。任何运行ANSI C的系统均支持流,但并不是所有系统都支持文件描述字,有的系统根本不支持文件描述字或仅仅实现了文件描述字函数集合的一个子集。因此,一般情况下,应当坚持使用流而不是文件描述字,除非是想做某种特殊操作,而此操作只能用文件描述字才能完成。
本章将介绍的标准I/O函数均针对流操作,第3章将介绍针对文件描述字的I/O函数。

  1. 文件名与路径名
    UNIX系统中几乎每一种对象都表示为文件,不仅是通常的数据集合,系统中的每一个设备也表示为文件。文件被安排在目录中,目录本身又含有子目录,由此形成了文件系统的层次结构。

目录本身也是一种文件,不过它的内容是一组连接实际文件的文件名及相关信息,这些连接称为链或目录登记项(4.2.2节)。我们前面虽然说 “文件被安排在目录中”,但是实际上目录只包含指向文件的指针而不是文件本身。为了理解文件名的语法,首先需要理解UNIX文件系统的目录层次结构。
系统中,每一个用户均有一个主目录,其文件通常存储在这个目录以及该目录的子目录中。例如,用户kjzhao,他的主目录是/home/kjzhao,在其主目录中有系统帮助建立的几个标准目录,如.bash_profile等;也有由他自己创建的子目录,如用于日常工作的目录work,用于应用程序的目录program等。另外一些用户的主目录也可能位于/home目录中,而/home则是根目录“/”的子目录。在根目录中通常还包括用于系统程序的子目录/bin,用于系统配置文件的子目录/etc,用于系统库文件的子目录/lib,以及代表各种物理设备的子目录/dev等。图2-1是这种目录层次的一个示例图。
UNIX中,当涉及一个文件的名字时,常常使用术语“文件名”或“路径名”。但按POSIX标准术语,文件名和路径名分别有不同的含义:文件名指的是不带路径的文件名,而路径名的含义则较广泛,它既包括含路径的文件名,也包括单个文件名。不过,从一般用户的角度来看,由于路径名总是用来引用文件,因此有时也不加区分地统称路径名为文件名。为了叙述方便,本节我们按POSIX标准区分路径名和文件名。在其他章节中,只要上下文含义清楚,我们也不加区分地使用路径名和文件名。
同其他操作系统一样,UNIX中每一个文件都有一个名字,此名字为一字符串,即文件名。文件名用于命名一个文件,它由1至NAME_MAX个字符组成,这些字符可以是字符集中除斜线字符(/)和空字符(NUL)之外的任意字符。系统宏NAME_MAX是POSIX定义的文件名的最大字符个数(不是字符串的长度,该计数不包括结束的空字符)。文件名也称为路径名分量。
路径名用于标识一个文件,它是由1至PATH_MAX个字符组成的字符串。路径名由用斜线“/”分隔的一至多个路径名分量构成的序列组成。路径名开始的斜线是可选的,仅由一个分量构成的路径名标识一个相对于当前目录的文件,多个连续的“/”字符等价于单个“/”字符。一个具有多个路径名分量的路径名命名一个目录以及在该目录中的文件。系统宏PATH_MAX是POSIX定义的路径名的最大字符个数,大多数现代UNIX版本中该值定为1024, Linux则没有限制。
以“/”开头的路径名称为绝对路径名,此路径名的第一个分量位于根目录;其他路径名称为相对路径名,它们的第一个分量位于当前工作目录(4.9.1节)。

b416ca96299e9a6840a63b380351d923c5e51854

路径名分量“.”和“..”有特殊的含义。“.”表示当前目录,“..”表示当前目录的父目录。作为一个例外,根目录中的“..”表示的是根目录本身。
标识一个目录的路径名可以任选地以斜线“/”结尾。可用路径名“/”来引用根目录。下面是一些路径名的例子:
/a/b 根目录下子目录a中的文件b
a 当前工作目录中名为a的文件
./a 与a相同
../a 当前工作目录的父目录中名为a的文件
与Windows操作系统不同,UNIX没有任何关于文件扩展名或文件版本的内建支持作为文件名语法的一部分。虽然许多实用程序使用有关文件名的一些约定,如C源代码文件通常具有后缀为“.c”的名字,但是,这并不意味着UNIX文件系统本身强制这类约定。

  1. 文件位置
    对于已打开的文件,它的属性之一是文件位置。文件位置给出文件中当前可读写字符的位置,在所有POSIX兼容的系统中,它是一个表示距文件开始多少字节数的整数。

当文件刚打开时,文件位置位于文件的开始处,之后每当读出或者写入一个字符,文件的位置便增加一字节。换言之,对文件的访问是顺序的。
但是,对于以“添加”(append)打开的文件(2.3节),其写出的处理有点特殊。对这种文件的写出总是顺序地附加在该文件的末尾,而不管文件的位置如何。其文件位置只用于控制从文件读出数据。
普通文件(4.2.1节)允许读写文件的任意位置。这种允许读写任意位置的文件也称为随机文件。可以用函数fseek()或lseek()改变随机文件的位置。如果企图改变一个不支持随机访问的文件的位置,则会得到ESPIPE错误。磁盘文件一般均是随机文件,终端则不是随机文件。
UNIX环境中,多个进程可同时读一个文件。为了使得每个进程都能够按自己的步调读文件,每个进程必须有自己的文件位置指针,这样才不会受到其他进程的影响。事实上,进程每次打开一个文件都会创建一个独立的文件位置。因此,即使在同一个程序中打开一个文件两次,也会得到两个具有独立文件位置的流或描述字。但是,如果打开一个文件描述字,然后复制它得到另一个文件描述字(3.5节),则这两个文件描述字会共享同一文件位置:改变一个文件描述字的文件位置将影响另一个描述字的文件位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言编常见算法,5个常见C语言算法

5个常见C语言算法十进制转换为二进制的递归程序字符串逆置的递归程序整数数位反序&#xff0c;例如12345->54321四舍五入程序(考虑正负数)二分法查找的递归函数#include#include#include//十进制转换为二进制的递归程序voidDecimalToBinary(int n){if(n<0){printf("…

利用Kinect将投影变得可直接用手操控

Finally 总算是到了这一天了&#xff01;假期里算法想不出来&#xff0c;或者被BUG折磨得死去活来的时候&#xff0c;总是YY着什么时候能心情愉快地坐在电脑前写一篇项目总结&#xff0c;今天总算是抽出时间来总结一下这神奇的几个月。 现在回过头来看&#xff0c;上学期退出AC…

springboot自动配置的原理_SpringBoot自动配置原理

SpringBoot的启动入口就是一个非常简单的run方法&#xff0c;这个run方法会加载一个应用所需要的所有资源和配置&#xff0c;最后启动应用。通过查看run方法的源码&#xff0c;我们发现&#xff0c;run方法首先启动了一个监听器&#xff0c;然后创建了一个应用上下文Configurab…

Django first lesson 环境搭建

pycharm ide集成开发环境 &#xff08;提高开发效率&#xff09; 解释器/编译器编辑器调试环境虚拟机连接 设置VirtualBox端口 操作1 操作2 点击号添加&#xff0c;名称为SSH&#xff0c;其中主机端口为物理机的端口&#xff0c;这里设置为1234&#xff0c;子系统端口为虚拟机的…

《Drupal实战》——3.3 使用Views创建列表

3.3 使用Views创建列表 我们接着讲解Views的设置&#xff0c;首先做一个简单的实例。 3.3.1 添加内容类型“站内公告” 添加一个内容类型“站内公告”&#xff0c;属性配置如表3-1所示。 为该内容类型设置Pathauto的模式news/[node:nid]&#xff0c;并且我们在这里将节点类型…

idea mybatis generator插件_SpringBoot+MyBatis+Druid整合demo

最近自己写了一个SpringBootMybatis(generator)druid的demo1. mybatisgenerator逆向工程生成代码1. pom文件pom文件添加如下内容&#xff0c;引入generator插件org.mybatis.generator mybatis-generator-maven-plugin 1.3.5 mysql …

python isalnum函数_探究Python中isalnum()方法的使用

探究Python中isalnum()方法的使用 isalnum()方法检查判断字符串是否包含字母数字字符。 语法 以下是isalnum()方法的语法&#xff1a; str.isa1num() 参数 NA 返回值 如果字符串中的所有字符字母数字和至少有一个字符此方法返回 true&#xff0c;否则返回false。 例子 下面的例…

动态规划算法——最长上升子序列

今天我们要讲的是最长上升子序列&#xff08;LIS&#xff09;。【题目描述】给定N个数&#xff0c;求这N个数的最长上升子序列的长度。【样例输入】      【样例输出】7        42 5 3 4 1 7 6那么什么是最长上升子序列呢&#xff1f; 就是给你一个序列…

如何快速掌握一门新技术/语言/框架

IT行业中的企业特点是都属于知识密集型企业。这种企业的核心竞争力与员工的知识和技能密切相关。而如果你在企业中扮演的是工程师的角色的话&#xff0c;那么 你的核心竞争力就是IT相关的知识与技能的储备情况。而众所周知&#xff0c;IT行业是一个大量产生新知识的地方&#x…

c语言今天星期几问题,C语言输入今天星期几

满意答案迷茫03222015.07.24采纳率&#xff1a;55% 等级&#xff1a;9已帮助&#xff1a;665人123456789101112131415161718192021#include<stdio.h>int main(void){ enum weekday{ sun, mon, tue, wed, thu, fri, sat }; int n; printf("输入星期数(0-…

备忘录模式 详解

定义 在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff1b; 行为型模式 角色 发起人角色&#xff08;Originator&#xff09;&#xff1a;记录当前时刻的内部状态&#xff0c;负责定义哪些属于备份范围的状态&#xf…

dll oem证书导入工具_技术干货 | 恶意代码分析之反射型DLL注入

欢迎各位添加微信号&#xff1a;qinchang_198231 加入安全 交流群 和大佬们一起交流安全技术01技术概要这是一种允许攻击者从内存而非磁盘向指定进程注入DLL的技术&#xff0c;该技术比常规的DLL注入更为隐蔽&#xff0c;因为除了不需要磁盘上的实际DLL文件之外&#xff0c;它…

锐捷亮相GITC:请互联网企业为我点个赞!

【51CTO.com原创稿件】GITC全球互联网技术大会已成功举办四届&#xff0c;今年的会议现场依然是摩肩接踵围观者众。围绕互联网热点技术&#xff0c;众人根据云、大数据、安全、运维、基础架构的不同主题&#xff0c;各自聚成小圈子展开深入交流。 锐捷的展位在主会场的内侧&…

react.lazy 路由懒加载_React lazy/Suspense使用及源码解析

React v16.6.0已经发布快一年了&#xff0c;为保障项目迭代发布&#xff0c;没有及时更新react版本&#xff0c;最近由于开启了新项目&#xff0c;于是使用新的react版本进行了项目开发。项目工程如何搭建&#xff0c;如何满足兼容性要求&#xff0c;如何规范化等等这里不作为介…

c语言数据结构系统化,C语言数据结构+数据库+操作系统

http://cv.qiaobutang.com/post/55c419b20cf2009bd4607795第二部分是专业相关的C &#xff0c;数据库&#xff0c;操作系统&#xff0c;数据结构。http://c.biancheng.net/cpp/u/shuju/数据(Data)是信息的载体&#xff0c;它能够被计算机识别、存储和加工处理。它是计算机程序加…

c语言判断一个序列是不是另一个的子序列

1 #include <stdio.h>2 #include <string.h>//添加字符串头文件3 4 int Subsequence(char s[], char t[]) 5 {6 int m,n,i,j;7 n strlen(s); //n表示序列S的长度8 m strlen(t); //m表示序列T的长度9 i0; 10 j0; 11 if (m>…

linux中python如何调用matlab的数据_特征锦囊:如何在Python中处理不平衡数据

今日锦囊特征锦囊&#xff1a;如何在Python中处理不平衡数据? Index1、到底什么是不平衡数据2、处理不平衡数据的理论方法3、Python里有什么包可以处理不平衡样本4、Python中具体如何处理失衡样本印象中很久之前有位朋友说要我写一篇如何处理不平衡数据的文章&#xff0c;整理…

Hadoop不适合哪些场景 哪些场景适合?

Hadoop设计的目的主要包括下面几个方面&#xff0c;也就是所谓的适用场景&#xff1a; 1&#xff1a;超大文件 可以是几百M&#xff0c;几百T这个级别的文件。 2&#xff1a;流式数据访问 Hadoop适用于一次写入&#xff0c;多次读取的场景&#xff0c;也就是数据复制进去之后&a…

阿里Android p6准备,项目经历准备篇——如何准备阿里巴巴P6/P7前端面试

项目经历准备篇——如何准备阿里巴巴P6/P7前端面试在上次的校招文章之后&#xff0c;有很多同学问有没有社招相关的东西可以写一篇&#xff0c;现在它来了。比起校招&#xff0c;社招更加看重项目经历项目经历反应的思考。本文针对的是想进入阿里的P6/P7同学&#xff0c;着重讲…

for in for of区别_Python 第4课:for…in循环黄金搭档之range()函数

乐学趣学Py● 04&#xff1a;for…in循环黄金搭档之range()函数●Python趣味小百科Python中的绘图模块为什么叫Turtle海龟&#xff0c;而不是cat ,dog,bird呢&#xff1f;原来Python引用了麻省理工大学教授开发的logo海龟制图语言,能通过绘图直观地教大家学习编程。实践是最好的…