【笔记】UNIX环境高级编程

以存储器分配函数 m a l l o c为例。有多种方法可以进行存储器分配及与其相关的无用区收集操作 (最佳适应,首次适应等),并不存在对所有程序都最佳的一种技术。U N I X系统调用中处理存储器分配的是s b r k ( 2 ),它不是一个通用的存储器管理器。它增加或减少指定字节数的进程地址空间。如何管理该地址空间却取决于进程。存储器分配函数 m a l l o c ( 3 )实现一种特定类型的分配。如果我们不喜欢其操作方式,则可以定义自己的 m a l l o c函数,它可能将使用s b r k系统调用。事实上,有很多软件包,它们实现自己的存储器分配算法,但仍使用 s b r k系统调用。
在这里插入图片描述

有多种情况可使实际读到的字节数少于要求读字节数:
• 读普通文件时,在读到要求字节数之前已到达了文件尾端。例如,若在到达文件尾端之前还有3 0个字节,而要求读1 0 0个字节,则r e a d返回3 0,下一次再调用r e a d时,它将返回0 (文件尾端)。
• 当从终端设备读时,通常一次最多读一行(第11章将介绍如何改变这一点)。
• 当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。
• 某些面向记录的设备,例如磁带,一次最多返回一个记录。

至今我们已介绍了两种不同的文件类型—普通文件和目录。U N I X系统的大多数文件是普通文件或目录,但是也有另外一些文件类型:
(1) 普通文件(regular file)。这是最常见的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据对于内核而言并无区别。对普通文件内容的解释由处理该文件的应用程序进行。
(2) 目录文件(directory file)。这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读许可权的任一进程都可以读该目录的内容,但只有内核可以写目录文件。
(3) 字符特殊文件(character special file)。这种文件用于系统中某些类型的设备。
(4) 块特殊文件(block special file)。这种文件典型地用于磁盘设备。系统中的所有设备或者是字符特殊文件,或者是块特殊文件。
( 5 ) F I F O。这种文件用于进程间的通信,有时也将其称为命名管道。1 4 . 5节将对其进行说明。
(6) 套接口( s o c k e t )。这种文件用于进程间的网络通信。套接口也可用于在一台宿主机上的进程之间的非网络通信。第1 5章将用套接口进行进程间的通信。
(7) 符号连接(symbolic link)。这种文件指向另一个文件。4 . 1 6节将更多地述及符号连接。

第一个规则是,我们用名字打开任一类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应具有执行许可权。这就是为什么对于目录其执行许可权位常被称为搜索位的原因。
注意,对于目录的读许可权和执行许可权的意义不相同。读许可权允许我们读目录,获得在该目录中所有文件名的列表。当一个目录是我们要存取文件的路径名的一个分量时,对该目录的执行许可权使我们可通过该目录(也就是搜索该目录,寻找一个特定的文件名)。

在图中有两个目录项指向同一 i节点。每个i节点中都有一个连接计数,其值是指向该 i节点的目录项数。只有当连接计数减少为 0时,才可删除该文件(也就是可以释放该文件占用的数据块)。这就是为什么“解除对一个文件的连接”操作并不总是意味着“释放该文件占用的磁盘块”的原因。这也就是为什么删除一个目录项的函数被称之为 u n l i n k而不是d e l e t e的原因。在s t a t结构中,连接计数包含在s t _ n l i n k成员中,其基本系统数据类型是 n l i n k _ t。这种连接类型称之为硬连接。回忆表2 - 7,其中,P O S I X . 1常数L I N K _ M A X指定了一个文件连接数的最大值。

编号为2 5 4 9的i节点,其类型字段表示它是一个目录,而连接计数为 2。任何一个叶目录(不包含任何其他目录,也就是子目录的目录)其连接计数总是2,数值2来自于命名该目录(t e s t d i r)的目录项以及在该目录中的 .项。编号为1 2 6 7的i节点,其类型字段表示它是一个目录,而其连接计数则大于或等于3。它大于或等于3的原因是,至少有由三个目录项指向它:一个是命名它的目录项(在图4 - 3中没有表示出来),第二个是在该目录中的.项,第三个是在其子目录t e s t d i r中 的… 项。注意,在工作目录中的每个子目录都使该工作目录的连接计数增 1。

u n l i n k的这种特性经常被程序用来确保即使是在程序崩溃时,它所创建的临时文件也不会遗留下来。进程用o p e n或c r e a t创建一个文件,然后立即调用u n l i n k。因为该文件仍旧是打开的,所以不会将其内容删除。只有当进程关闭该文件或终止时(在这种情况下,内核关闭该进程所
打开的全部文件),该文件的内容才被删除。

我们也可以用 r e m o v e函数解除对一个文件或目录的连接。对于文件, r e m o v e的功能与u n l i n k相同。对于目录,r e m o v e的功能与r m d i r相同。

符号连接是对一个文件的间接指针,它与上一节所述的硬连接有所不同,硬连接直接指向文件的i节点。引进符号连接的原因是为了避免硬连接的一些限制: ( a )硬连接通常要求连接和文件位于同一文件系统中, ( b )只有超级用户才能创建到目录的硬连接。对符号连接以及它指向什么没有文件系统限制,任何用户都可创建指向目录的符号连接。符号连接一般用于将一个
文件或整个目录结构移到系统中其他某个位置。

注意修改时间( s t _ m t i m e )和更改状态时间( s t _ c t i m e )之间的区别。修改时间是文件内容最后一次被修改的时间。更改状态时间是该文件的 i节点最后一次被修改的时间。

传统的U N I X实现在内核中设有缓冲存储器,大多数磁盘 I / O都通过缓存进行。当将数据写到文件上时,通常该数据先由内核复制到缓存中,如果该缓存尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓存以便存放其他磁盘块数据时,再将该缓存排入输出队列,然后待其到达队首时,才进行实际的 I / O操作。这种输出方式被称之为延迟写(delayed write)(Bach 〔1 9 8 6〕第3章详细讨论了延迟写)。延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓存中内容的一致性,U N I X系统提供了s y n c和f s y n c两个系统调用函数。
s y n c只是将所有修改过的块的缓存排入写队列,然后就返回,它并不等待实际 I / O操作结束。系统精灵进程(通常称为u p d a t e )一般每隔3 0秒调用一次s y n c函数。这就保证了定期刷新内核的块缓存。命令s y n c ( 1 )也调用s y n c函数。
函数f s y n c只引用单个文件(由文件描述符f i l e d e s指定),它等待I / O结束,然后返回。f s y n c可用于数据库这样的应用程序,它确保修改过的块立即写到磁盘上。比较一下 f s y n c和O _ S Y N C标 志(见3 . 1 3节)。当调用f s y n c时,它更新文件的内容,而对于 O _ S Y N C,则每次对文件调用w r i t e函数时就更新文件的内容。

第5章 标 准 I/O 库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UNIX环境高级编程笔记是关于在UNIX系统中进行高级编程的一些笔记和技巧的记录。这些笔记主要涉及文件I/O和进程管理等方面的内容。在UNIX系统中,文件I/O是通过文件描述符来进行操作的。文件描述符是一个整数,用来标识打开的文件。为了实现跨平台的兼容性,可以使用POSIX标准来进行文件操作。POSIX是一个操作系统接口的标准,它以UNIX为基础,但并不限于UNIX类系统。此外,Single UNIX Specification简称SUS,它是POSIX.1标准的一个超集,定义了UNIX系统的实现标准。在UNIX系统中,进程的初始化是由init进程来完成的。init进程会读取文件/etc/ttys,并根据其中定义的终端设备进行处理。对于每个允许登录的终端设备,init进程会调用fork函数生成一个子进程,并通过exec函数执行getty程序来处理该终端设备。通过这些技巧和方法,可以实现在UNIX环境下进行高级编程的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [UNIX环境高级编程笔记](https://blog.csdn.net/qq_55537010/article/details/127837953)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [《UNIX环境高级编程》学习笔记](https://blog.csdn.net/qq_42526420/article/details/123143423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值