Unix系统编程()文件空洞】的更多相关文章

<Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候都会发生缓冲.通过缓冲可以在一定程度上将用户空间与实际的物理设备分离,还可以减少内核访问磁盘的次数. 先来看看关于内核缓冲区高速缓冲:read和write调用在对磁盘文件进行操作的时候不会直接访问磁盘,如下图所示. 例如:write(fd, "abc", 3) write调用会将"…
<Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h>文件中的常量. 通过cat 命令查看: lancelot@debian:~/Code/tlpi$ cat /usr/include/limits.h /* Copyright (C) 1991, 1992, 1996, 1997, 1998, 1999, 2000, 2005 Free Software Fo…
<Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于Linux的学习记录,因为觉得自己学得不好,老是写不出东西.但是现在觉得学习记录应该坚持写,慢慢就会有收获,坚持写才可以锻炼自己的表达能力. <Linux/Unix系统编程手册>这本书的评价很高,但是个人觉得翻译得不太好.其实终究是因为自己的英文阅读能力太差和没什么钱,只能看翻译版.看了接近一个月,…
<Linux/Unix系统编程手册>读书笔记1  (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2  (创建于4月9日,最后更新4月10日) <Linux/Unix系统编程手册>读书笔记3  (创建于4月15日) <Linux/Unix系统编程手册>读书笔记4  (创建于4月20日) <Linux/Unix系统编程手册>读书笔记5  (创建于4月22日) <Linux/Unix系统编程手册>读书笔记…
<Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有更深入的研究一定会写出来. 下图为磁盘分区与文件系统的关系 文件系统中的文件(目录)在i-node表上都有唯一的记录(i-node).i-node通过数据块指针指向数据块,这些数据块就是该i-node对应的文件的数据. i-node与数据块的关系如下: 因为Linux支持很多类型的文件系统,但是每种文件系统的…
<Linux/Unix系统编程手册>读书笔记 目录 第9章 这章主要讲了一堆关于进程的ID.实际用户(组)ID.有效用户(组)ID.保存设置用户(组)ID.文件系统用户(组)ID.和辅助组ID. 实际用户ID决定执行者是谁. 有效用户ID决定该进程执行时获取的文件权限.PS:有效用户ID为0的进程拥有超级用户的所有权限. 认识保存设置用户ID(saved set-user-ID)的时候先来看看设置用户ID(set-user-ID)(对于文件的). 如果可执行文件设置了设置用户ID,当该文件执行…
<Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/group. 每个用户都有唯一的用户名和相关的用户标识符(UID).用户可以属于一个或多个组,每个组都有唯一的组名和相关的组标识符(GID). 用户和组的用途为:1.可以确定各种系统资源的所有权:2.对赋予进程访问上述资源的权限加以控制. 首先来看一下密码文件/etc/passwd lancelot@debia…
<Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以避免竞争状态(两个或多个共享资源的进程或线程的运行结果是一个无法预期的顺序). 以独占方式创建一个文件:对文件是否存在的检查和创建文件属于同一个原子操作.防止新建文件的时候因为检查文件是否存在和新建文件之间发生中断(而其他进程也在新建相同文件名的文件),导致两个进程都认为自己是文件的创建者. 向文件尾部追加数…
Linux下操作系统编程有两本经典APUE即<Advanced Programming in the UNIX Environment>和TLPI<The Linux Programming Interface>,中文版对应<UNIX环境高级编程(第3版)>和<Linux/UNIX系统编程>. TLPI洋洋洒洒英文版1506页,中文版1176页:一共64章节,明显是作为工具书使用.通过目录可以了解本书的结构,以及作者的组织形式. 背景知识及概念:共3章分别介…
关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wait()等. <Linux/UNIX系统编程手册>第63章主要介绍了select()/poll().信号驱动IO.epoll三方面,以及他们之间异同.优劣点. 这里准备结合项目中遇到的问题,分两个方向进行归纳总结.一是一个IO模型从测试程序.API.内核实现进行纵向分析:二是横向不同IO模型的优缺…
0.目录 1.概念 2.系统资源 3.学习方法 4.从用户的角度来理解 Unix 4.1 登录--运行程序--注销 4.2 目录操作 4.3 文件操作 5.从系统的角度来理解 Unix 5.1 网络桥牌 5.2 bc:Unix 的计算器 5.3 从 bc/dc 到 Web 6.小结 1.概念 概念: Unix 系统包含用户程序和系统内核 内核由多个子系统构成 内核管理所有的程序和资源 进程之间的通信对 Unix 程序是很重要的 什么是系统编程 相关命令: bc 一些术语: 内存空间用来存放程序和…
本章预热与后续系统编程有关的概念. 术语“操作系统”通常包含2种含义:一是指完整的软件包,包括管理计算机资源的核心组件,已经附带的标准软件:二是独指管理硬件的内核. 内核具有诸多概功能,包括: 进程管理 内存管理 文件系统支持 设备管理 在内核的管理下,操作系统会给每个用户营造一种抽象:虚拟化,即使得每个用户感觉自己在独占机器. 内核通过硬件将CPU分为2种状态,一种是用户态,又称目态:另一种是核心态,又称管态.两者区别是对CPU的限制,前面一种有很大限制,后一种无限制. 操作系统的一切活动都掌…
关键词: 1. socket基础 一个典型的客户端/服务器场景中,应用程序使用socket进行通信的方式如下: 各个应用程序创建一个socket.socket是一个允许通信的设备,两个应用程序都需要用到它. 服务器将自己的socket绑定到一个众所周知的地址上是的客户端能够定位到它的位置. 关键socket API包括以下下几种: socketr()创建一个新的socket. bind()将一个socket绑定到一个地址上.通常服务器需要使用这个调用来将其socket绑定到一个众所周知的地址上使…
<Linux/Unix系统编程手册>读书笔记 目录 第7章: 内存分配 通过增加堆的大小分配内存,通过提升program break位置的高度来分配内存. 基本学过C语言的都用过malloc来分配内存,而malloc都基于brk()和sbrk(). #include <unistd.h> int brk(void *end_data_segment); int *sbrk(intptr_t increment); brk()系统调用会将program break设置为end_dat…
<Linux/Unix系统编程手册>读书笔记 目录 第6章 这章讲进程.虚拟内存和环境变量等. 进程是一个可执行程序的实例.一个程序可以创建很多进程. 进程是由内核定义的抽象实体,内核为此实体分配执行程序所需的系统资源. 从内核的角度来看,进程是由用户内存空间和内核数据结构组成的.程序的代码和代码中的变量存放在用户内存空间,内核数据结构用于维护进程状态信息. 对于每个进程都有一个唯一的进程号(进程ID)(正数),用来标识系统中的某个程序. getpid(),返回调用该函数的进程的进程ID. #…
如果程序的文件偏移量已然跨越了文件结尾,然后再执行IO操作,将会发生什么情况? read调用将会返回0,表示文件结尾.令人惊讶的是,write函数可以在文件结尾后的任意位置写入数据. 从文件结尾后到新写入数据的这段空间被称为文件空洞. 从编程的角度来看,文件空洞是存在字节的,读取空洞将返回以0(空字节)填充的缓冲区. 然而,文件空洞不占用任何磁盘空间.知道后续某个时间点,在文件空洞中写入了数据,文件系统才会为之分配磁盘块. 文件空洞的优势在于,与为实际需要的空字节分配磁盘块相比,稀疏的填充文件会…
1.标准C库中访问文件用的是文件指针FILE *(stdin,stdout,stderr):对于linux系统编程而言,所有对设备或文件的操作都是通过文件描述符进行的 2.当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数),后续对文件的操作只需要通过文件描述符,内核记录有关这个打开文件的信息 3.一个进程启动时,默认打开了3个文件,标准输入.标准输出.标准错误,对应文件描述符是0(STDIN_FILENO).1(STDOUT_FILENO).2(STDERR_FILENO),…
2018-1-30 一.UNIX.C语言以及Linux的历史回顾 1. UNIX简史.C语言的诞生 1969年,贝尔实验室的Ken Thompson首次实现了UNIX系统. 1973年,C语言步入成熟期,人们以其重写了几乎整个UNIX内核. 2. UNIX两大分支:BSD.System V 1969~1979年间,UNIX历经了多个版本,其中从第七版起,UNIX分裂为两大分支:BSD和System V. 加州大学伯克利分校为UNIX开发了许多新特性,然后发布了属于自己的UNIX发布版——BSD.…
1.文件描述符 文件描述符是一个非负整数,当打开一个现有文件或创建一个新文件时候,内核向进程返回一个文件描述符,新打开文件返回文件描述符表中未使用的最小文件描述符.Unix系统shell使用文件描述符0与进程的标准输入相关联,文件描述符1与进程的标准输出相关联,文件描述符2与进程的标准出错相关联,在POSIX标准中,幻数0.1.2应当替换为符号常量STDIN_FILENO.STDOUT_FILENO和STDERR_FILENOLinux最大打开文件描述符数 cat /proc/sys/fs/fi…
本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作,进行进程间的通信等. 系统调用与C语言的函数调用类似.但是系统调用的过程比C语言函数调用复杂,开销也大得多. Linux 的系统调用通过 int 0x80 实现,用系统调用号来区分入口函数.操作系统实现系统调用的基本过程是:应用程序调用库函数(API):API 将系统调用号存入 EAX,然后通过中断…
每个进程所分配的内存由很多部分组成,通常称之为"段(segment)". 文本段包含了进程运行的程序机器语言指令.文本段具有只读属性,以防止进程通过错误指针意外修改自身指令. 因为多个进程可同时运行同一程序,所以又将文本段设为可共享,这样,一份程序代码的拷贝可以映射到所有这些进程的虚拟地址空间中. 初始化数据段包含显式初始化的全局变量和静态变量.当程序加载到内存时,从可执行文件中读取这些变量的值. 未初始化数据段包括了未进行显式初始化的全局变量和静态变量. 程序启动之前,系统将本段内所…
之前知道lseek这个系统调用可以改变文件的偏移量,或者叫偏移量或指针. 文件偏移量是指执行下一个read或者write操作的文件起始位置,会以相对于文件头部起始点的文件当前位置来表示. 除非指定了O_APPEND选项. 文件第一个字节的偏移量为0. 文件打开时,会将文件偏移量设置为指向文件的开始,以后每次read或write调用将自动对其进行调整,以指向已读或已写数据后的下一字节.因此连续的read和write调用将按顺序递进,对文件进行操作. lseek会根据offset和whence参数值…
根据考纲整理了一下本学期系统编程课的知识点,并且做成了思维导图便于理解和记忆 主要都是一些比较入门的知识点,UNIX博大精深,每一个知识点其实都能深挖 因为博客园不可能直接出思维导图,本文的主要内容都在图里(丢到typora里面数了下,完整的那个思维导图一共有近6k字) 正常版思维导图: 详细(超长爆炸)版思维导图:[图片很大,加载会比较慢]…
当打开一个文件时,建立用户与该文件的联系.其实质是将该文件在辅存中的有关目录信息.辅存i节点及相应的文件地址索引表拷贝到主存中.文件系统中管理这一方面的机构成为打开文件管理机构,简称打开文件机构. 打开文件机构由三部分组成.它们是活动的i节点表(主存索引节点).打开文件表和用户文件描述表. 补充: 活动i节点表: 当执行打开文件操作时,将文件辅存i节点的有关信息拷贝到主存某一固定区域中,此时文件称为活动文件,读进主存的这个索引节点称为主存索引节点或活动i节点.主存这一区域称为活动i节点表,它是由…
1.安装openssh-server模块 sudo apt-get install ssh openssh-server 2.使用命令 将本地文件拷贝到远程 scp 文件名 –用户名@计算机IP或者计算机名称:远程路径 从远程将文件拷回本地 scp –用户名@计算机IP或者计算机名称:文件名 本地路径 命令格式 scp local_file remote_username@remote_ip:remote_folder 或者 scp local_file remote_username@remo…
Unix的开发不受控于某一个厂商或者组织,是由诸多商业和非商业团体共同贡献进行演化的.这导致两个结果:一是Unix集多种特性于一身,二是由于参与者众多,随着时间推移,Unix实现方式逐渐趋于分裂. 由于第二个结果导致的发展就是:大家要求统一标准.类似秦王扫六合,统一文字和货币. Unix出现之后很快出现了C语言,随后Unix被C语言重写,这也是第一个以高级语言开发的操作系统.由于使用了高级语言,使得Unix能够像其他硬件架构进行移植,因为不再使用依赖硬件的低级语言了. C/C++语言是系统编程语…
Unix系统提供了两种方法来改变信号处置:signal和sigaction.这篇描述的是signal系统调用,是设置信号处理的原始API,所提供的接口比sigaction简单.另一方面,sigaction提供了signal所不具备的功能.进一步而言,signal的行为在不同UNIX实现间存在差异,这也意味着对可移植性有所追求的程序绝不能使用此调用来建立信号处理器函数.故此,sigaction是建立信号处理器的首选API. #include <signal.h> void (*signal(in…
在堆上分配内存 进程可以通过增加堆的大小来分配内存,所谓堆是一段长度可变的连续虚拟内存,始于进程的未初始化数据段末尾,随着内存的分配和释放而增减.通常将堆的当前内存边界称为"program break". 下面也会学习一族函数brk,sbrk和malloc. 调整program break:brk和sbrk 改变堆的大小(即分配或释放内存),其实就像命令内核改变进程的program break位置一样简单.最初,program break正好位于未初始化数据段末尾之后(和&en…
目前学习到的是一个文件描述符对应着一个打开的文件,似乎是对应的关系.但是实际上并不是这样的.多个文件描述符指向同一个打开的文件,是可能的也是必要的.这些文件描述符可以在相同或者不同的进程中打开. 要理解具体情况,需要查看内核维护的3个数据结构. 进程级的文件描述符表 系统级的打开文件表 文件系统的i-node表 针对每个进程,内核为其维护打开文件的描述符(open file descriptor)表.该表的每一条目都记录了单个文件描述符的相关信息.包括有一下信息: 控制文件描述符操作的一组标志.…
Bourne shell的IO重定向语法2>&1,意在通知shell把标准错误(文件描述符2)重定向到标准输出(文件描述符1).因此下列命令将把标准输出和标准错误写入result.log文件.(shell按从左至右的顺序处理IO重定向语句) shell通过复制文件描述符2实现了标准错误的重定向操作,因此文件描述2与文件描述符1指向同一个打开文件的句柄.可以通过调用dup和dup2来实现此功能. 对于这种重定向的操作,仅仅打开一个目标文件两次是远远不够的(第一次在描述符1上打开,第二次在描述符…