【Linux】UNIX环境高级编程(知识点概括)
UNIX环境高级编程(知识点概括)
自学习总结整理,后期持续更新
文章目录
- UNIX环境高级编程(知识点概括)
- 文件I/O
- 文件和目录
- 标准I/O库
- 系统数据文件和信息
- 进程环境
- 进程控制
- 进程关系
文件I/O
缓冲文件系统:在内存开辟一个“缓冲区”,为程序中的每一个文件使用;当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依此读出需要的数据
fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek
非缓冲文件系统:借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问(只能读写二进制文件)
open, close, read, write, getc, getchar, putc, putchar
举个栗子:
fopen函数,在用户态下就有缓冲
open函数,在文件读写时则每次都需要进行内核态和用户态的切换
(顺序访问文件:fopen函数比直接调用open函数快;随机访问文件:相反)
/dev/fd 文件夹,其中的文件为0,1,2 …,每一个文件都代表一个文件描述符
名词理解
文件描述符:一个非负整数,当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符,0、1、2系统默认表示标准输入、标准输出、标准错误
I/O效率:系统I/O效率受限于read、write系统调用的次数,而系统调用次数则又受限于内核缓冲区的大小
文件共享:每个文件描述符会与一个打开的文件相对应,不同的文件描述符也可能指向同一个文件,相同的文件可以被不同的进程打开,也可以在同一个进程被多次打开。内核使用三种数据结构表示打开的文件,分别是进程表项、文件表、v节点表
文件和目录
文件类型
- 普通文件
- 目录文件: 这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针
- 块特殊文件: 提供对设备带缓冲的访问
- 字符特殊文件: 提供对设备不带缓冲的访问
- FIFO: 用于进程通信, 称之为管道
- socket:用于网络通信
- 符号链接:这种文件指向另一个文件
黏着位(只有root才能设置黏着位)
- 如果一个可执行程序被设置了黏着位,那么当程序第一次被执行,在终止的时候,程序正文部分的一个副本仍被保存在交换区。使得下次执行的时候能较快将其载入内存
- 如果对一个目录设置了黏着位,那么只有对该目录具有写权限的用户并且满足(拥有此文件 / 拥有此目录 / root用户)条件之一,才能删除或重命名该目录下的文件
文件长度
- 对于普通文件,长度可为0
- 对于目录文件,文件长度一般是一个数(如16或512)的倍数
- 对于符号链接,文件长度就是文件名中的实际字节数
文件的空洞
空洞是由所设置的偏移量超过文件尾端,并写入了某些数据后造成的
文件系统
自举块:也称为引导块,分区中文件系统自身引导程序存放的地方
超级块:超级块在每个文件系统的根上,超级块描述和维护文件系统的状态
符号链接(软连接)
- 硬链接:硬链接直接指向文件的i节点(只有root用户才能创建硬链接)
- 软链接:一般用于将一个文件或整个目录结构移至系统中另一位置,类似于快捷方式
相关函数
返回文件相关信息:stat, fstat, fstatat, lstat
访问权限测试:access, faccessat
设置创建文件时的默认权限:umask
改变现有文件的访问权限: chown, fchown, fchownat
截断文件:truncate, ftruncate
创建一个指向现有文件的链接:link, linkat
删除一个现有的目录项:unlink, unlinkat
重命名文件或目录:rename, renameat
创建/删除链接:link/unlink
更改访问时间和修改时间:futimens, utimensat, utimes
创建目录/删除空目录:mkdir, mkdirat / rmdir
更改当前工作目录:chdir, fchdir
获取当前工作目录的绝对路径名:getcwd
标准I/O库
流和FILE对象
表示流的数据类型是FILE类型。流的定向决定了所读、写的字符是单字节还是多字节的。FILE是系统定义的数据结构,它含有标准I/O库管理流所需要的与文件有关的所有内部状态信息
缓冲
标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。它也对每个I/O流自动进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。
- 全缓冲:在填满标准I/O缓冲区后才进行实际I/O操作(对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲的)
- 行缓冲:当在输入和输出中遇到换行符,标准I/O库执行I/O操作
- 不带缓冲:标准I/O库不对字符进行缓冲存储(标准出错是不带缓冲的)
读和写流
每次一个字符的I/O。一次读或写一个字符,如果流是带缓冲的,则标准I/O函数会处理所有缓冲。
每次一行I/O。如想要一个读或写一行,则使用fgets和fputs。每行都以一个换行符终止。
直接I/O。fread和fwrite函数支持这种类型的I/O。每次I/O操作读或写某种数量的对象,而每个对象具有指定的长度。
相关函数
清楚一个流的定向:freopen
设置流的定向:fwide
更改缓冲类型:setbuf, setvbuf
打开标准I/O流/关闭流:fopen, freopen, fdopen / fclose
每次一个字符的I/O/的读写:getc/putc, fgetc/fputc, getchar/putchar
每次一行I/O/的读写:fgets/fputs, gets/puts
二进制I/O的读写:fread, fwrite
定位流:
ftell/fseek(假定文件的位置可以存放在一个长整型中)
ftello/fseeko(文件偏移量不一定使用长整型)
fgetpos/fsetpos(抽象数据类型fpos_t记录文件的位置)
格式化I/O:
格式化输出:printf, fprintf, sprintf, snprintf
格式化输入:scanf, fscanf, sscanf
获取文件描述符:fileno
创建临时文件:tmpnam, tmpfile
创建内存流:fmemopen, open_memstream, open_wmemstream
系统数据文件和信息
口令文件(/etc/passwd文件)
口令文件中的登录项由7个以冒号分隔的字段组成,依次是:登录名、加密口令、数字用户ID (205)、数字组ID (105)、注释字段、起始目录(/home/sar) 以及shell程序( /bin/ksh)
阴影口令
系统将加密口令放在另一个称为阴影口令的文件中,该文件至少包含用户名和加密口令
组文件
UNIX组文件包含的字段,依次是:组名、加密口令、数值组ID、指向各用户名的指针的数组
其他数据文件
- 口令 /etc/passwd
- 组 /etc/group
- 阴影 /etc/shadow
- 主机 /etc/hosts
- 网络 /etc/networks
- 协议 /etc/protocols
- 服务 /etc/services
登陆账户记录
utmp文件记录当前登陆到系统的各个用户
wtmp文件跟踪各个登陆和注销事件
相关函数
获取口令文件项(登录名或用户ID):getpwnam, getpwuid
获取口令文件项(整个口令文件):getpwent, setpwent, endpwent
返回系统的版本信息和内核信息:uname
一般情况下,对于每个数据文件至少有3个函数:
get函数:读下一个记录,该函数一般返回指向一个结构的指针,当达到文件尾端时返回空指针
set函数,打开相应数据文件,然后反绕该文件,如果希望在文件起始开始处理,则调用此函数
end函数:关闭相应数据文件
进程环境
main函数
int main(int argc, char *argv[])
argc,命令行中参数的个数
argv,使用空格分隔,包含指向命令行参数值的指针,其中argv[0]为程序名
进程终止
5种正常终止
main()返回
exit()
_Exit()
多线程中,最后一个线程从启动例程返回
多线程中,最后一个线程调用pthread_exit()
3种异常终止
- abort()
- 接到一个信号
- 多线程中,最后一个线程对取消请求做出相应
命令行参数
当执行一个程序时,调用exec的进程可将命令行参数传递给该新程序
环境表
environ是环境指针,指向环境表(字符指针数组),环境表的各个指针指向环境字符串,环境字符串由name=value这样的字符串组成
C程序的存储空间布局
从低地址到高地址依次为:正文段、初始化数据段(数据段)、未初始化数据段(bss段)、栈、堆
正文段,是CPU执行的机器指令部分。正文段通常是只读的,以防止程序被修改
初始化数据段,通常称此段为数据段,包含了程序已赋初值的变量
未初始化数据段,通常称为bss段(block started by symbol)
栈,自动变量及函数调用所需保存的信息都存放在此段中
堆,动态存储分配在堆进行
共享库
共享库使得可执行文件不需要包含公用的库函数,而只需在所有进程中都可引用的存储区中保存这种库函数的一个副本。程序第一次执行时,用动态链接方法将程序与共享库函数相链接
- 静态函数库,实际上就是简单的一个普通的目标文件的集合,在编译过程中已经被载入可执行程序
- 共享函数库,在一个可执行程序在启动的时候被加载,在编译过程中仅简单的引用
存储空间分配(free)
malloc,分配指定字节数的存储区,初始值不确定
calloc,为指定数量指定长度的对象分配存储空间。该空间的每个bit都初始化为0
realloc,增加或减少以前分配区的长度。增加长度时,可能需要移动到另一个足够大的区域,新增区域内的初始值不确定
相关函数
获取环境变量值:getenv
把当前状态信息保存到env:setjmp
回复保存到env的状态信息:longjmp
查询和修改资源限制:getrlimit, setrlimit
进程控制
进程标识
每个进程都有唯一的进程ID,是非负整数
- 进程0 调度进程,常常被称为交换进程
- 进程1 init进程,在自举过程结束时由内核调用
- 进程2 页守护进程
竞争条件
当多个进程都企图对共享数据进程某种处理,而最后的结果又取决于进程运行的先后顺序时,我们认为这发生了竞争条件
解释器文件
解释器文件是文本文件,而解析器是可执行的二进制文件。解析器是由解析器文件的第一行指定的
进程会计
开启之后,每次进程终止kernel都会将信息写入会计记录,比如:使用了多少CPU time,开始的时间等等。
相关函数
创建新进程:fork, vfork
- vfork和fork一样创建新的进程, 但child不引用的地址空间,不会复制到child中去;child简单的在vfork之后调用exec或exit。换句话说,在执行exec或exit之前,child运行在parent的地址空间。
- vfork保证child首先执行,直到child调用exec或者exit。调用之后,恢复parent的执行
结束进程:exit
阻塞进程:wait, waitpid, waitid
- wait会阻塞直到子进程中止。waitpid能有option能防止阻塞
- waitpid不等待第一个中止的child process,有相应option控制等待哪个进程
- waitid和waidpid一样允许等待指定的子进程,但将process ID和process group ID使用了分离的参数,而不是像waitpid和wait一样合成为一个参数
wait3, wait4
- 提供了与wait,waitpid,waitid函数唯一不能提供的特性:增加了额外的参数,用于存放中止进程的所有资源的汇总和其所有的子进程
初始化新的程序:exec
调用fork产生子进程,由子进程来调用:system
获取登录名:getlogin
获取进程时间:times
进程关系
- 终端登录
【Linux】UNIX环境高级编程(知识点概括)相关推荐
- Linux - Unix环境高级编程(第三版) 代码编译
Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...
- 《Unix环境高级编程》学习笔记:从点到面
以前在课堂上学习过<Unix初级教程(第四版)>,对于Unix有了一点了解.由于以后使用的需要,要对它进行比较深入的学习,为此需要阅读不少的书籍,这本<Unix环境高级编程>便 ...
- [阅读体会] UNIX环境高级编程
文章目录 写在开始阅读前 (我会的知识点,在体会里是不提的,并不是书中没有,这里着重于记录我之前不会的,但读过书之后学会的.) 第一章 第二章 2.1 引言 2.2 UNIX标准化 2.2.1 ISO ...
- Unix环境高级编程 笔记
Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...
- 《UNIX环境高级编程(第3版)》——1.7 出错处理
本节书摘来自异步社区<UNIX环境高级编程(第3版)>一书中的第1章,第1.7节,作者:[美]W. Richard Stevens , Stephen A.Rago著,更多章节内容可以访问 ...
- unix环境高级编程 pdf_UNIX系统编程宝典,每一本都值得程序员珍藏
这几本UNIX系统编程宝典,重印无数次,几代程序员都视如珍宝的几本书,小编在出版圈里快十年了,见证了这本书图灵版.异步社区版的出版.营销,对这套书倾注了一定的感情.今天继续分享给你们,好书总会有人还不 ...
- 开发日记-20190827 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 3
Referred Blogs 文件描述符标志,文件状态标志 Linux中文件描述符fd和文件指针flip的理解 Linux编程–文件描述符fd 文件共享 Unix支持在不同进程间共享文件. 内核使用了 ...
- 开发日记-20190822 关键词 读书笔记《Unix环境高级编程(第二版)》《掌控习惯》DAY 2
Preface 话说,昨天开始尝试着去改变自己,从基础的习惯开始,11:30准时睡觉,平时差不多12:30才睡觉.按理说,比平时早了一个小时睡觉吧,然后我就把闹钟提前了45分钟,想着还能比平常多睡15 ...
- apue.h头文件(UNIX环境高级编程)
相信非常多初学<UNIX环境高级编程>的朋友都会遇到一个问题,执行里面的实例(download: http://www.apuebook.com/ )时就出现故障,提示 "错误: ...
- UNIX环境高级编程笔记之文件I/O
一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是"哇"这种很吃惊的表情.其实大概三年前,那会 ...
最新文章
- cpu安装_CPU是AMD的,老台式电脑可以加装固态硬盘安装Win10系统吗?
- 你是否能判断电机损毁风险?
- cisco交换机命令大全(5)
- java中用iterator去检查最大值_Java中的Iterator vs forEach
- Android xmlns 的作用及其自定义
- Move Zeroes
- python利用pygame框架实现类似大鱼吃小鱼游戏 (松鼠吃松鼠) code from making games with python and pygame
- 变态ie6之要求css与页面编码一致引发的问题
- Linux下SVN客户端基本使用教程
- 【Unity3D插件】Camera Filter Pack插件分享《摄像机镜头特效插件》
- Magisk 安装error
- PHP实现微信网页登陆授权开发
- 《获取Windows中的当前时区列表》
- c++ 输入数字 输出汉语读法(拼音)代码
- python opencv入门 光流法(41)
- 如何绘制神经网络结构图,如何设计神经网络结构
- 取消win7共享打印机等需要输入密码
- 产品结构设计的主要内容有哪些?
- html网站meta标签大全
- 贷后催收评分模型中的数据清洗与数据治理细节介绍
热门文章
- 五种主流的linux操作系统,五款常用的Linux操作系统
- 121、华为交换机配置手册
- 交换机设备登录账号权限1_Stelnet(ssh)登陆华为交换机配置教程
- Linux连接锐捷校园网客户端
- 介绍几款在线编程工具(Python)
- linux点亮桌面,教你如何点亮自己的Ubuntu 屏幕
- 三级分销系统源码如何上传?
- VC6.0 files---open 出现 MSDEV.exe错误,Project ---- add to project 出现错误等等~~
- html 时间控件 只选择年,js时间控件只显示年月
- 毕业论文免费查重软件测评及降重心得