1 - UNIX基础知识

Github 地址


1. 操作系统

可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。通常将这种软件称为 内核 (kernel) 。( LinuxGNU 操作系统的内核 )

内核 的接口是 系统调用 (system call)公用函数库 构建在系统调用之上,应用程序既可以调用公用函数库,也可以使用系统调用。shell 是一个特殊的应用程序,为运行其他应用程序提供了一个接口。

2. shell

shell 是一个命令行解释器,它读取用户输入,然后执行命令。shell 的输入来自终端(交互式shell)或文件(shell脚本)。

3. 文件系统

UNIX 文件系统 是目录和文件的一种层次结构。

目录 (dictionary) 是一个包含目录项的文件。逻辑上,可以认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。

目录中的每个文字称为 文件名 (filename) ,创建新目录时会自动创建了两个文件名:\(.\) 和 \(..\) ,点指向当前目录,点点指向父目录。在最高层次的根目录中,点点与点相同。

4. 输入和输出

文件描述符 (file descriptor) 通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。每当运行一个新程序时,所有的shell都将为其打开3个文件描述符,标准输入 (standard input)标准输出 (standard output) 以及 标准错误 (standard error)

函数 openreadwritelseek 以及 close 提供了不带缓冲的 I/O 。这些函数都使用文件描述符。

标准 IO 函数 为不带缓冲的 IO函数提供了一个带缓冲的接口。在头文件 stdio.h 中定义。

5. 程序和进程

程序 (program) 是一个存储在磁盘上某个目录中的可执行文件。内核使用 exec 函数将程序读入内存。

程序的执行实例被称为 进程 ,UNIX系统确保每个进程都有一个唯一的数字标识符,称为 进程ID (process ID) ,是一个非负整数。程序可调用 getpid 得到进程ID,返回一个 pid_t 的数据类型,标准会保证它保存在一个长整型中。

有3个用于进程控制的主要函数:forkexecwaitpid

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基础知识的更多相关文章

  1. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  2. Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级 ...

  3. (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  4. (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  5. (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. (八) 一起学 Unix 环境高级编程 (APUE) 之 信号

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  8. (九) 一起学 Unix 环境高级编程 (APUE) 之 线程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  9. (十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  10. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. Java并发编程 (二) 并发基础

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.CPU多级缓存-缓存一致性 1.CPU多级缓存 ​ 上图展示的是CPU高级缓存的配置,数据的读取和存 ...

  2. Java实现 LeetCode 784 字母大小写全排列(DFS)

    784. 字母大小写全排列 给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串.返回所有可能得到的字符串集合. 示例: 输入: S = "a1b2" ...

  3. Java实现蓝桥杯 算法提高 盾神与积木游戏

    题目描述 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西.但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他 小朋 ...

  4. Java实现 洛谷 采药

    题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:" ...

  5. Java实现 LeetCode 23 合并K个排序链表

    23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输 ...

  6. Java实现最大连续子数组和

    1 问题描述 给定一个整数数组,数组里可能有正数.负数和零.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.例如,如果输入的数组为{1,-2,3,10,-4, ...

  7. Java实现洛谷 P1428 小鱼比可爱

    题目描述 人比人,气死人:鱼比鱼,难死鱼.小鱼最近参加了一个"比可爱"比赛,比的是每只鱼的可爱程度.参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只 ...

  8. Python快速入门文档

    前言 此文本质为本人学习Python过程中的笔记,部分地方叙述表达可能不够清晰,欢迎留言. (本文适合有一定程序语言基础的读者阅读(最好是c语言)) 一.基本语法 1.框架: (1)以缩进表示层次所属 ...

  9. 运行npm run start 提示primordials is not defined

    下载https://github.com/ant-motion/editor-list 执行 npm install npm start gulp构建时报错. 原因:安装gulp版本与node版本不兼 ...

  10. linux下gdb调试方法与技巧整理

    参考博客:  https://blog.csdn.net/niyaozuozuihao/article/details/91802994 1.运行命令run:简记为 r ,其作用是运行程序,当遇到断点 ...