UNIX环境高级编程——1.UNIX基础知识

news2024/10/7 20:26:02

UNIX基础知识

UNIX体系结构
  • 严格意义上来说,可以将操作系统定义为一种软件,控制计算机硬件资源,提供程序运行环境。通常把这种软件成为内核。
  • 内核的接口被成为系统调用(system call)。公共函数库构建在系统调用接口之上,应用程序既可使用公共函数库,也可使用系统调用。shell是一个特殊的应用程序,为其他应用程序提供接口。
  • 从广义上来说,操作系统包含了内核和一些其他软件,这些软件使得计算机能够发货作用,并且具有自己的特性。这些软件包含了系统实用程序(system utility)、应用程序、shell以及公用函数库等。
    unix
文件与目录
  • UNIX文件系统是目录和文件的一种层次结构,所有东西的起点是称为根(root)的目录,这个目录的名称是一个字符“/”。
  • 创建新目录时会自动创建了两个文件名:.(称为点)和…(称为点点)。点指向当前目录,点点指向父目录。在最高层次的根目录中,点点与点相同。
输入和输出
  • 文件描述符(file descriptor)通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。
  • 每当运行一个新程序时,所有的 shell 都为其打开 3 个文件描述符,即标准输入(standard input)、标准输出(standard output)以及标准错误(standard error)。如果不做特殊处理,例如就像简单的命令ls,则这3个描述符都链接向终端。
  • 函数open、read、write、lseek以及close提供了不带缓冲的I/O。这些函数都使用文件描述符。
  • 两个常量STDIN_FILENO和STDOUT_FILENO定义在<unistd.h>头文件中,它们指定了标准输入和标准输出的文件描述符。在POSIX标准中,它们的值分别是0和1,但是考虑到可读性,我们将使用这些名字来表示这些常量。
  • 标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口。使用标准I/O函数无需担心如何选取最佳的缓冲区大小,使用标准I/O函数还简化了对输入行的处理(常常发生在UNIX的应用程序中)。
程序和进程
  • 程序(program)是一个存储在磁盘上某个目录中的可执行文件。内核使用exec函数(7个exec函数之一),将程序读入内存,并执行程序。
  • 程序的执行实例被称为进程(process)。某些操作系统用任务(task)表示正在被执行的程序。
  • UNIX系统确保每个进程都有一个唯一的数字标识符,称为进程ID(process ID)。进程ID总是一个非负整数。
  • 有3个用于进程控制的主要函数:
    • fork:创建一个新进程,新进程是调用进程的一个副本。
    • exec(七种变体):执行命令或程序文件
    • waitpid:返回子进程的终止状态(status 变量)
  • 通常,一个进程只有一个控制线程(thread)(某一时刻执行的一组机器指令)。
  • 一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与进程相关的属性。因为它们能访问同一存储区,所以各线程在访问共享数据时需要采取同步措施以避免不一致性。
  • 与进程相同,线程也用ID标识。但是,线程ID只在它所属的进程内起作用。一个进程中的线程ID在另一个进程中没有意义。
出错处理
  • 对于 errno 应当注意两条规则。第一条规则是:如果没有出错,其值不会被例程清除。因此,仅当函数的返回值指明出错时,才检验其值。第二条规则是:任何函数都不会将 errno 值设置为0,而且在<errno.h>中定义的所有常量都不为0。
用户标识
  • 用户 ID 为 0 的用户为根用户(root)或超级用户(superuser)
  • 现今的UNIX系统使用32位整型数表示用户ID和组ID
信号
  • 信号(signal)用于通知进程发生了某种情况。例如,若某一进程执行除法操作,其除数为0,则将名为SIGFPE(浮点异常)的信号发送给该进程。
  • 进程有以下3种处理信号的方式。
    • 忽略信号
    • 按系统默认方式处理
    • 提供一个函数,信号发生时调用该函数,这被称为捕捉该信号
  • 在一个进程中调用此函数就可向另一个进程发送一个信号。当然这样做也有些限制:当向一个进程发送信号时,我们必须是那个进程的所有者或者是超级用户。
时间
  • 日历时间:自协调世界时(Coordinated Universal Time, UTC)以来所经过的秒数累计值。系统基本数据类型time_t用于保存这种时间值。
  • 进程时间:CPU时间,用以度量进程使用的中央处理器资源。进程时间以时钟滴答计算。系统基本数据类型clock_t保存这种时间值。
    • 时钟时间:进程运行的时间总量,其值与系统中同时运行的进程数有关。
    • 用户CPU时间:执行用户指令所用的时间量。
    • 系统CPU时间:为该进程执行内核程序所经历的时间。
系统调用和库函数
  • UNIX所使用的技术是为每个系统调用在标准C库中设置一个具有同样名字的函数。用户进程用标准C调用序列来调用这些函数,然后,函数又用系统所要求的技术调用相应的内核服务。
  • 系统调用通常提供一种最小接口,而库函数通常提供比较复杂的功能。
习题
  • 1.1:在系统上验证,除根目录外,目录.和…是不同的。

    • 答:在根目录执行ls .和ls …输出不变
  • 1.2:分析图1-6程序的输出,说明进程ID为852和853的进程发生了什么情况?

    • 答:在大多数的Linux/Unix系统中,生成一个进程ID的方法是从0开始依次连续分配,所以在两次程序运行之间,系统创建了两个新的进程。
  • 在1.7节中,perror的参数是用ISO C的属性const定义的,而strerror的整型参数没有用此属性定义,为什么?

    #include <string.h>
    char *strerror(int errnum);
    
    #include <stdio.h>
    void perror(const char *msg);
    
    • 答:函数声明中,strerror传参是int类型,会发生值的拷贝,不会修改原来的值,而perror传参是const char*类型,传的是地址,如果不适用const修饰符,在函数内修改了值会导致外部变量的值也发生变化。
  • 若日历时间存放在带符号的32位整型数中,那么到哪一年它将溢出?可以用什么方法扩展溢出浮点数?采用的策略是否与现有的应用相兼容?

    • 答:带符号的32位整型数能表示的最大值是2147483647,约为68.09625973年,也就是说会在格林威治时间2038年01月19日溢出。采用double扩展溢出浮点数,不过问题是浮点数与现有的定点数应用无法兼容。
  • 若进程时间存放在带符号的32位整型数中,而且每秒为100时钟滴答,那么经过多少天后该时间值将会溢出?

    • 答:也就是计算时钟滴答什么时候溢出,2147483647 / 3600 / 24 / 100 = 248.55
参考资料
  • http://c.biancheng.net/view/314.html
随书练习源码地址
  • https://github.com/Johncdy/BookSource/tree/main/Advanced_Programming_in_the_UNIX_Environment

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

碳酸锂、碳酸氢锂除钙镁离子交换柱

锂及其盐类是国民经济和国防建设中具有重要意义的战略物资&#xff0c;也是与人们生活息息相关的能源材料。而碳酸锂作为锂盐的基础盐&#xff0c;是制取锂化合物和金属锂的原料&#xff0c;可作铝冶炼的电解浴添加剂&#xff0c;亦可用于合成橡胶、染料、半导体等方面。电池级…

Orin+ GMSL (Ser 9295+Des 9296)流程分析(1)

文章目录 1 前言2 流程分析2.1 整体架构2.2 Ser端2.2 Des端2.3 软件架构2.4 设备树文件分析2.5 VI 接口2.7 CSI 接口1 前言 Maxim 支持GMSL作为汽车行业视频应用的通信链路。GMSL基于SerDes (Serializer-Deserializer)技术;也就是说,它在发送端使用序列化器,在接收端使用反序…

观察UE4中引用查看器(ReferenceViewer)是从哪得到数据的

前言 引用查看器(ReferenceViewer)可以显示资源引用关系数据&#xff0c;我想要知道这个数据是如何得到的。因此从它的界面代码开始一步步往里看。 &#xff08;到最后才发现&#xff0c;得到引用关系数据的接口很简单&#xff0c;而且是蓝图可访问的&#xff0c;详见本篇的【…

冬至已至,你的在职读研2023能在社科院与杜兰大学金融管理硕士项目实现吗

杜甫《小至》中写道“天时人事日相催&#xff0c;冬至阳生春又来”。不知不觉间冬至悄然到来&#xff0c;过完冬至天气日渐回暖&#xff0c;春天即将回来了。时光总是匆匆而逝&#xff0c;一晃2022年将要与我们说再见了。这一年来&#xff0c;反复无常的疫情&#xff0c;瞬息万…

【学习笔记】JDK源码学习之HashTable(附带面试题)

【学习笔记】JDK源码学习之HashTable(附带面试题) 其他好文&#xff1a; 【学习笔记】JDK源码学习之LinkedHashMap&#xff08;附带面试题【学习笔记】JDK源码学习之HashMap&#xff08;附带面试题&#xff09;【学习笔记】JDK源码学习之Vector&#xff08;附带面试题&#x…

OpenCV基础入门

主要了解包括 opencv 的下载和环境配置opencv目录的了解opencv中highgui模块opencv中core模块opencv中imgproc模块opencv中feature2d模块opencv视频操作 1.OpenCV简介 图像是人类视觉的基础&#xff0c;是自然景物的客观反映。 模拟图像通过某种物理量的强弱变化来记录图像…

中小企业远程办公指南:10分钟搭建,即插即用

不装了 我成小阳人了 虽然还没算过来人&#xff0c;但是想要提醒一下小伙伴“能不阳就别阳”&#xff0c;“能晚阳就晚阳”&#xff01; 真的很痛很难受。 为了应对即将到来的高峰&#xff0c;我们在上周末紧急采取了远程居家办公模式。 不得不说&#xff0c;公司应对突发情…

彻底卸载2345王牌输入法的方法

2345王牌输入法是2345公司旗下一款中文输入法软件&#xff0c;主打纯净输入&#xff0c;有用户用了一段时间觉得不太习惯&#xff0c;就想卸载装别的软件&#xff0c;但是发现怎么也卸不掉&#xff0c;下面小编就给大家介绍彻底卸载2345王牌输入法的方法。 方法一&#xff1a;使…

线性代数 --- Gauss消元的部分主元法和完全主元法(补充)

Gauss消元的部分主元法和完全主元法(补充) 本文主要是对下文的补充&#xff0c;而补充的主要内容就是如何直接求出(手动)部分主元法的P矩阵和L矩阵&#xff1a; 线性代数 --- Gauss消元的部分主元法和完全主元法_松下J27的博客-CSDN博客_高斯消元的主元是什么Gauss消元的部分主…

MyBatisPlus ---- MyBatis-Plus简介

MyBatisPlus ---- MyBatis-Plus简介1. 简介2. 特性3. 支持数据库4. 框架结构1. 简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 愿景&#xff1a; 我们的…

艾美捷内皮血管生成检测试剂盒的多种特点

血管生成&#xff08;Angiogenesis&#xff09;是指源于已存在的毛细血管和毛细血管后微静脉的新的毛细血管性血管的生长。内皮血管生成是一个极其复杂的过程。通常新生血管是在原有的血管基础上延伸扩展而形成的&#xff0c;其过程类似于典型的伤口愈合和胚胎形成过程。在血管…

RK3568下载SDK编译源码

前面我们已经搭建好了编译一个环境https://blog.csdn.net/qq_24093081/article/details/128394606 所以在这里我们就需要下载瑞芯微提供的SDK进行编译&#xff0c;由于RK3568支持多种系统&#xff0c;比如Android11&#xff0c;Linux&#xff08;debian、Ubuntu、buildroot、yo…

TCP网络编程

1. 网络相关概念 网络通信&#xff1a;两台设备之间通过网络实现数据传输&#xff1b;java.net包下提供了一系列的类或接口&#xff0c;完成网络通信&#xff1b; 局域网&#xff1a;覆盖一个学校、单位、公司&#xff1b; 城域网&#xff1a;覆盖一个城市&#xff1b; 广域网…

力扣(15.18)补9.19

15.三数之和 我以为不会太难&#xff0c;md不会。 其实很让我惊讶的是&#xff0c;双指针用了2层循环但复杂度确是O&#xff08;n&#xff09;。牛&#x1f42e;&#x1f42e;&#x1f42e;&#x1f42e;&#x1f42e;&#x1f42e;&#x1f42e;&#x1f42e;&#x1f42e;&am…

自动控制原理笔记-结构图及其等效变换

目录 结构图&#xff1a; 得到系统结构图的两种方式 &#xff1a; 方框图画结构图&#xff1a; 微分方程组画结构图&#xff1a; 结构图等效变换规则&#xff1a; 结构图的化简&#xff1a; 小结&#xff1a; 结构图&#xff1a; 得到系统结构图的两种方式 &#xff1a…

WebMagic

1.介绍 WebMagic是一款简单灵活的爬虫框架。基于它你可以很容易的编写一个爬虫。 WebMagic由四个组件(Downloader、PageProcessor、Scheduler、Pipeline)构成&#xff0c;核心代码非常简单&#xff0c;主要是将这些组件结合并完成多线程的任务。这意味着&#xff0c;在WebMag…

K8S——存储ConfigMap

configMap描述信息 ConfigMap 功能在 Kubernetes1.2 版本中引入&#xff0c;许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。 ConfigMap API 给我们提供了向容器中注入配置信息的机制&#xff0c;ConfigMap 可以被用来保存单个属性&#xff0c;也可以用来保…

hutool工具并发使用 Sftp sftp = new Sftp(sshHost, sshPort, sshUser, sshPass) 的坑

目录问题描述解决方案Sftp(sshHost, sshPort, sshUser, sshPass) 分析Sftp(Session session) 分析吐槽另外还有一坑 delFile(String filePath)问题描述 看到前人的代码中使用 Sftp sftp new Sftp(sshHost, sshPort, sshUser, sshPass) ; 来创建一个Sftp客户端&#xff0c;然后…

Automatic Exposure Correction of Consumer Photographs 分析

文章目录Automatic Exposure Correction of Consumer Photographs1. 图像分割2. 按灰度区域合并3. 根据细节多少和各zone相对对比度约束&#xff0c;求解每个zone对应的 最优zone.4. 每个zone以及对应的最有zone找到之后&#xff0c;可以求解多项式curve的 ϕs\phi_sϕs​ 和 ϕ…

【Flask框架】——24 创建ROM映射

创建ROM映射 ORM&#xff1a;Object Relationship Mapping 创建一个类&#xff0c;一个类对应了一个数据库中的一张表&#xff0c;类的数据属性对应了表中的字段名&#xff0c;这个类称为映射类。 根据映射类创建出一个一个的对象&#xff0c;每个对象对应了表中的一条实际的…