Linux中的主要系统调用
Linux 操作系统中就是创建进程。创建进程的系统调用叫fork。在 Linux 里,要创建一个新的进程,需要一个老的进程调用 fork 来实现,其中老的进程叫作父进程(Parent Process),新的进程叫作子进程(Child Process)。
当父进程调用 fork 创建进程的时候,子进程将各个子系统为父进程创建的数据结构也全部拷贝了一份,甚至连程序代码也是拷贝过来的。按理说,如果不进行特殊的处理,父进程和子进程都按相同的程序代码进行下去,这样就没有意义了。
对于 fork 系统调用的返回值,如果当前进程是子进程,就返回 0;如果当前进程是父进程,就返回子进程的进程号。这样首先在返回值这里就有了一个区分,然后通过 if-else 语句判断,如果是父进程,还接着做原来应该做的事情;如果是子进程,需要请求另一个系统调用execve来执行另一个程序,这个时候,子进程和父进程就彻底分道扬镳了,也就产生了一个分支(fork)了。
有个系统调用waitpid,父进程可以调用它,将子进程的进程号作为参数传给它,这样父进程就知道子进程运行完了没有,成功与否。
在操作系统中,每个进程都有自己的内存,互相之间不干扰,有独立的进程内存空间。
对于进程的内存空间来讲,放程序代码的这部分,我们称为代码段(Code Segment)。
对于进程的内存空间来讲,放进程运行中产生数据的这部分,我们称为数据段(Data Segment)。其中局部变量的部分,在当前函数执行的时候起作用,当进入另一个函数时,这个变量就释放了;也有动态分配的,会较长时间保存,指明才销毁的,这部分称为堆(Heap)。
进程自己不用的部分就不用管,只有进程要去使用部分内存的时候,才会使用内存管理的系统调用来登记,说自己马上就要用了,希望分配一部分内存给它,但是这还不代表真的就对应到了物理内存。只有真的写入数据的时候,发现没有对应物理内存,才会触发一个中断,现分配物理内存。
当分配的内存数量比较小的时候,使用 brk,会和原来的堆的数据连在一起,这就像多分配两三个工位,在原来的区域旁边搬两把椅子就行了。当分配的内存数量比较大的时候,使用 mmap,会重新划分一块区域,也就是说,当办公空间需要太多的时候,索性来个一整块。
对于文件的操作,下面这六个系统调用是最重要的:
- 对于已经有的文件,可以使用open打开这个文件,close关闭这个文件;
- 对于没有的文件,可以使用creat创建文件;
- 打开文件以后,可以使用lseek跳到文件的某个位置;
- 可以对文件的内容进行读写,读的系统调用是read,写是write。
Linux 里有一个特点,那就是一切皆文件。
- 启动一个进程,需要一个程序文件,这是一个二进制文件。
- 启动的时候,要加载一些配置文件,例如 yml、properties 等,这是文本文件;启动之后会打印一些日志,如果写到硬盘上,也是文本文件。
- 但是如果我想把日志打印到交互控制台上,在命令行上唰唰地打印出来,这其实也是一个文件,是标准输出 stdout 文件。
- 这个进程的输出可以作为另一个进程的输入,这种方式称为管道,管道也是一个文件。
- 进程可以通过网络和其他进程进行通信,建立的 Socket,也是一个文件。
- 进程需要访问外部设备,设备也是一个文件。
- 文件都被存储在文件夹里面,其实文件夹也是一个文件。
- 进程运行起来,要想看到进程运行的情况,会在 /proc 下面有对应的进程号,还是一系列文件。
每个文件,Linux 都会分配一个文件描述符(File Descriptor),这是一个整数。有了这个文件描述符,我们就可以使用系统调用,查看或者干预进程运行的方方面面。
对于一些不严重的信号,可以忽略,该干啥干啥,但是像 SIGKILL(用于终止一个进程的信号)和 SIGSTOP(用于中止一个进程的信号)是不能忽略的,可以执行对于该信号的默认动作。每种信号都定义了默认的动作,例如硬件故障,默认终止;也可以提供信号处理函数,可以通过sigaction系统调用,注册一个信号处理函数。
Glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库。Glibc 为程序员提供丰富的 API,除了例如字符串处理、数学运算等用户态服务之外,最重要的是封装了操作系统提供的系统服务,即系统调用的封装。
每个特定的系统调用对应了至少一个 Glibc 封装的库函数,比如说,系统提供的打开文件系统调用 sys_open 对应的是 Glibc 中的 open 函数。
有时候,Glibc 一个单独的 API 可能调用多个系统调用,比如说,Glibc 提供的 printf 函数就会调用如 sys_open、sys_mmap、sys_write、sys_close 等等系统调用。
也有时候,多个 API 也可能只对应同一个系统调用,如 Glibc 下实现的 malloc、calloc、free 等函数用来分配和释放内存,都利用了内核的 sys_brk 的系统调用。
此文章为10月Day17学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。
相关文章:

Linux中的主要系统调用
Linux 操作系统中就是创建进程。创建进程的系统调用叫fork。在 Linux 里,要创建一个新的进程,需要一个老的进程调用 fork 来实现,其中老的进程叫作父进程(Parent Process),新的进程叫作子进程(C…...

在vscode中配置git bash终端、git 源码管理
打开vscode文件->首选项->设置,打开设置搜索shell windows将以下配置添加到vscode中的settings.json中 注意: terminal.integrated.profiles.windows这个配置项是就是添加终端的terminal.integrated.defaultProfile.windows这个是配置默认选项的…...

(三十四)大数据实战——scala运行环境安装配置及IDEA开发工具集成
前言 本节内容我们主要介绍一下scala运行环境的安装配置以及在idea开发工具中集成scala插件,便于scala项目的开发。 在开始scala安装配置之前,我们要先安装好jvm运行环境,scala运行于Java虚拟机(JVM)上,并…...
Double 4 VR智能互动教学系统的教学应用
1. 激发学习兴趣 Double 4 VR智能互动教学系统通过虚拟现实技术为学生创造了一个身临其境的学习环境。学生可以通过戴上VR头盔,进入虚拟世界中与教学内容互动。这种沉浸式的学习方式能够激发学生的学习兴趣,使他们更加主动地参与到课堂中来。 2. 提供直…...

GPU 驱动下载记录
1. 我的GPU 是这个:GeForce RTX 2060 下载链接是:Official Drivers | NVIDIA...
KILM: Knowledge Injection into Encoder-Decoder Language Models
本文是LLM系列文章,针对《KILM: Knowledge Injection into Encoder-Decoder Language Models》的翻译。 KILM:知识注入到编码器-解码器语言模型 摘要1 引言2 相关工作3 方法4 实验5 讨论6 结论局限性 摘要 大型预训练语言模型(PLMs)已被证明在其参数内保…...

205、使用消息队列实现 RPC(远程过程调用)模型的 服务器端 和 客户端
目录 ★ RPC模型(远程过程调用通信模型)▲ 完整过程:代码演示总体流程解释:ConstantUtil 常量工具类ConnectionUtil RabbitMQ连接工具类Server 服务端Client 客户端测试结果服务端客户端 完整代码ConstantUtil 常量工具类Connecti…...
C++中的函数
在C中,函数是程序的一部分,它执行特定的任务。函数的基本语法如下: type function-name( parameter list ) { body of the function } type 是函数的返回类型,function-name 是函数的名称, parameter list 是传递…...
java操作时间的方式
java操作时间的方式 获取年月日时分秒 public class Test { public static void main(String[] args) { System.out.println("----------使用Calendar--------------------"); Calendar cal Calendar.getInstance(); System.out.println(&q…...

上网冲浪发现多处XSS
突然的发现 今天上网冲浪,突然想起来有一种神器,叫废话生成器,之前是在哪里下了个软件玩了一下,然后就给删除了,因为我觉得这个软件不过就是调用了一个web接口实现的,一个网页能解决的事还要我下一个软件。…...
机器学习的打分方程汇总
机器学习的打分方程集合 受到机器学习(Machine Learning)和深度学习(Deep Learning)等算法模型的创新性冲击,其应用范围涵盖了自然语言处理(Natural Language Processing)、自动驾驶(…...

一文了解数据管理框架以及数据战略制定方法
这一节主要介绍数据管理这一章的另一重要部分,也就是我们在数据管理经常使用到的数据管理框架以及数据战略制定方法。 要制定数据管理框架,或者是组织需要制定数据治理规划或数据管理规划,需要首先制定与业务战略对齐的数据战略。 01、数据…...

智能管家“贾维斯”走进现实?AI Agent或成2023科技领域新风向标
漫威粉们想必都知道《钢铁侠》系列电影中,有一个不可或缺的角色——贾维斯。但就算是没有看过任何一部大电影的路人,只要通过一个词就可以了解“贾维斯”是一个什么样的角色——智能管家。 作为托尼斯塔克的助手,贾维斯的存在让主人的生活更…...

【广州华锐互动】VR高层小区安全疏散演练系统
在今天的高科技时代,虚拟现实(VR)技术已经被广泛应用到各个领域,包括教育和培训。由广州华锐互动定制开发的VR高层小区安全疏散演练系统,开始在房地产行业中崭露头角。这种系统通过模拟真实的紧急情况,帮助…...

用Python做一个文件夹整理工具
文章目录 简介文件夹对话框文件映射组件完整组件 简介 我们的目的是做一个像下面这样的工具,前面两个输入框,用于输入源路径和目标路径,下面的图片、视频、音乐表示在目标路径中创建的文件夹,后面的文件后缀,表示将这…...

Tortoise SVN 察看本地缓存密码
1、打开设置(Settings) 2、查看保存的数据 3、打开鉴权数据 4、查看密码 CTRLSHIFT双击表格,就会出现一列密码列 (我的是Mac PD虚拟Win11,CTRLSHIFTOPTION双击表格) 原文见这里: Recover SVN …...
MSP430F5529晶振配置
MSP430(F5529)相比MSP430(F149)来讲,功能更加强大。 UCS简介 MSP430F5XX/MSP430F6XX系列器件的UCS包含有五种时钟源,依次是:XT1CLK、VLOCLK、REFOCLK、DCOCLK和XT2CLK。这五种时钟的详细介绍请参考该系列芯片的指导手册,其中XT1C…...

[架构之路-237]:目标系统 - 纵向分层 - 网络通信 - DNS的递归查询和迭代查询
目录 一、DNS协议与DNS系统架构 1.1 什么是DNS协议 1.2 为什么需要DNS协议 1.3 DNS系统架构 二、DNS系统的查询方式 2.1 递归与迭代的比较 2.2 DNS递归查询 2.3 DNS迭代查询 一、DNS协议与DNS系统架构 1.1 什么是DNS协议 DNS(Domain Name Systemÿ…...

vue2 集成 Onlyoffice
缘起于进行了一次在线 Office 解决方案的调研,对比了 Office365、可道云、WPS Office、PageOffice 等厂商,最终敲定了使用 Onlyoffice,故整理了一份 Onlyoffice 从零开始系列教程,这是第一篇。 一、Onlyoffice 是什么?…...

天锐绿盾透明加密、半透明加密、智能加密这三种不同加密模式的区别和适用场景——@德人合科技-公司内部核心文件数据、资料防止外泄系统
由于企事业单位海量的内部数据存储情况复杂,且不同公司、不同部门对于文件加密的需求各不相同,单一的加密系统无法满足多样化的加密需求。天锐绿盾企业加密系统提供多种不同的加密模式,包括透明加密、半透明加密和智能加密,用户可…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀” 在JavaScript中,我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时,单纯依赖字符串或数组就显得力不从心了。这时ÿ…...
【Pandas】pandas DataFrame dropna
Pandas2.2 DataFrame Missing data handling 方法描述DataFrame.fillna([value, method, axis, …])用于填充 DataFrame 中的缺失值(NaN)DataFrame.backfill(*[, axis, inplace, …])用于**使用后向填充(即“下一个有效观测值”)…...
ABB馈线保护 REJ601 BD446NN1XG
配电网基本量程数字继电器 REJ601是一种专用馈线保护继电器,用于保护一次和二次配电网络中的公用事业和工业电力系统。该继电器在一个单元中提供了保护和监控功能的优化组合,具有同类产品中最佳的性能和可用性。 REJ601是一种专用馈线保护继电器…...

设计模式域——软件设计模式全集
摘要 软件设计模式是软件工程领域中经过验证的、可复用的解决方案,旨在解决常见的软件设计问题。它们是软件开发经验的总结,能够帮助开发人员在设计阶段快速找到合适的解决方案,提高代码的可维护性、可扩展性和可复用性。设计模式主要分为三…...
《开篇:课程目录》
大家好!我是一名.NET技术开发者,长期以来积累了比较多的项目实战经验,现在把它分享给大家,希望能够帮助到大家,同时为.NET社区提供一份力量,让更多的开发者参与进来。 要讲解的课程如下: 《介绍…...