《UNIX环境高级编程》(APUE) 笔记第一章 - UNIX基础知识
1 - UNIX基础知识
1. 操作系统
可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。通常将这种软件称为 内核 (kernel) 。( Linux 是 GNU 操作系统的内核 )
内核 的接口是 系统调用 (system call) ,公用函数库 构建在系统调用之上,应用程序既可以调用公用函数库,也可以使用系统调用。shell 是一个特殊的应用程序,为运行其他应用程序提供了一个接口。

2. shell
shell 是一个命令行解释器,它读取用户输入,然后执行命令。shell 的输入来自终端(交互式shell)或文件(shell脚本)。
3. 文件系统
UNIX 文件系统 是目录和文件的一种层次结构。
目录 (dictionary) 是一个包含目录项的文件。逻辑上,可以认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。
目录中的每个文字称为 文件名 (filename) ,创建新目录时会自动创建了两个文件名:\(.\) 和 \(..\) ,点指向当前目录,点点指向父目录。在最高层次的根目录中,点点与点相同。
4. 输入和输出
文件描述符 (file descriptor) 通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。每当运行一个新程序时,所有的shell都将为其打开3个文件描述符,标准输入 (standard input) 、标准输出 (standard output) 以及 标准错误 (standard error) 。
函数 open 、read 、write 、lseek 以及 close 提供了不带缓冲的 I/O 。这些函数都使用文件描述符。
标准 IO 函数 为不带缓冲的 IO函数提供了一个带缓冲的接口。在头文件 stdio.h 中定义。
5. 程序和进程
程序 (program) 是一个存储在磁盘上某个目录中的可执行文件。内核使用 exec 函数将程序读入内存。
程序的执行实例被称为 进程 ,UNIX系统确保每个进程都有一个唯一的数字标识符,称为 进程ID (process ID) ,是一个非负整数。程序可调用 getpid 得到进程ID,返回一个 pid_t 的数据类型,标准会保证它保存在一个长整型中。
有3个用于进程控制的主要函数:fork、 exec、 waitpid 。
int main()
{
char buf[MAXLINE];
pid_t pid;
int status;
printf("%% ");
while (fgets(buf, MAXLINE, stdin) != NULL) {
if (buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = 0; //execlp命令的参数要以NULL结尾而不是换行符
if ((pid = fork()) < 0) {
cout << "fork error" << endl;
exit(1);
}
else if (pid == 0) {
execlp(buf, buf, (char *)0);
cout << "couldn't execute: " << buf;
exit(127);
}
if ((pid = waitpid(pid, &status, 0)) < 0) {
cout << "waitpid error" << endl;
exit(1);
}
printf("%% ");
}
exit(0);
}
- 调用
fork创建一个新进程,被 调用一次 ,调用进程为 父进程 ,新创建的进程是 子进程 (父进程的一个副本);但 返回两次 ,对父进程返回子进程的进程ID,对子进程返回 \(0\) 。 - 子进程中,调用
execlp执行从标准输入中读入的命令,这就用新的程序文件替换了子进程原先执行的程序文件。 - 父进程希望等待子进程终止,这是通过调用
waitpid实现,pid参数为子进程ID,waitpid通过status的引用返回子进程终止状态,可用来判定子进程是如何终止的。
6. 线程
一个进程只有一个 控制线程 (thread) ——某一时刻执行的一组机器指令。对于某些问题,如果有多个控制线程分别作用于它的不同部分,解决起来就容易很多;并且多个控制线程也可以充分利用多处理器系统的并行能力。
一个进程内的所有线程共享同一地址空间、文件描述符、栈以及进程相关的属性。因为它们能访问同一存储区,所以各线程在访问共享数据时需要采取同步措施以 避免不一致性 。
线程ID 只在它所属的进程内起作用。
7. 系统调用和库函数
各版本的UNIX实现都提供良好定义、数量有限、直接进入内核的入口点,这些入口点被称为 系统调用 (system call) ,Linux中,由C语言定义。
通用库函数 可能会调用一个或多个内核的系统调用,也可能不使用系统调用。
系统调用 和 库函数 都以C函数的形式出现,两者都为应用程序提供服务。从用户角度来看,两者区别并不重要。
两者的另一个 区别 是:系统调用通常提供一种最小接口,而库函数通常提供比较复杂的功能。
《UNIX环境高级编程》(APUE) 笔记第一章 - UNIX基础知识的更多相关文章
- (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- Unix 环境高级编程 (APUE) 之 网络 IPC:套接字
一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级 ...
- (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (八) 一起学 Unix 环境高级编程 (APUE) 之 信号
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (九) 一起学 Unix 环境高级编程 (APUE) 之 线程
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
随机推荐
- Java实现 蓝桥杯VIP 算法训练 -2进制(暴力)
试题 算法训练 -2进制 问题描述 给出1个十进制整数N,计算出它的-2进制表示. 输入格式 第一行:一个整数N,表示要转换的十进制数. 输出格式 第一行:N的-2进制表示. 样例输入 -13 样例输 ...
- Java实现 LeetCode 54 螺旋矩阵
54. 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], ...
- Java中抽象类与接口的详细说明
首先简单的介绍一下抽象类: 定义是很简单的,我们这里不写官方的语言,我自己看着都烦,我们就用白话介绍,抽象类本质是一个类,没问题,那么类里面一般都是有方法的,方法包括方法名和方法体,这是常识对不对,那 ...
- java中Timer类的详细介绍(详解)
一.概念 定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和多线程技术还是有非常大的关联的.在JDK中Timer类主要负责计划任务的功能,也就是在指定 ...
- Java实现背包问题
1 问题描述 给定n个重量为w1,w2,w3,-,wn,价值为v1,v2,-,vn的物品和一个承重为W的背包,求这些物品中最有价值的子集(PS:每一个物品要么选一次,要么不选),并且要能够装到背包. ...
- java实现三进制转十进制
** 三进制转十进制** 不同进制的数值间的转换是软件开发中很可能 会遇到的常规问题.下面的代码演示了如何把键盘输入的3 进制数字转换为十进制.试完善之. BufferedReader br = ne ...
- windows server2012在已有.net4.5框架的基础上安装.net3.5的方法
我们在一台服务器运行各种程序的时候难免会用到一些好用的但是很老的软件.老软件也就难免需要以前的那种环境来运行,但是老的环境与新的环境往往不兼容.下面我就来讲一讲系统在已有.net4.5的情况下怎么安装 ...
- Servlet Session MVC模式
一 什么是Session 当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId). ...
- python2.7 正则表达式的学习
正则表达式是一种用来匹配字符串的强有力的武器.它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的. 因正则表达式也是用字符 ...
- 2019-02-01 Python爬虫爬取豆瓣Top250
这几天学了一点爬虫后写了个爬取电影top250的代码,分别用requests库和urllib库,想看看自己能不能搞出个啥东西,虽然很简单但还是小开心. import requests import r ...