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操作系统》,推荐该课程。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精准定位——MySQL日志学习的一天【错误、二进制、查询、慢查询】

MySQL 日志是记录 MySQL 数据库服务器运行过程中的各种活动和事件的文件。它们对于监控、故障排查、性能优化和数据恢复等方面都非常重要。 回顾一下Linux中查看文件的指令操作 cat 命令: cat 命令用于将文件的内容一次性输出到终端。它的主要功能是将文件连接起来…

Jetpack:011-Jetpack中标题栏

文章目录 1. 概念介绍2. 使用方法2.1 标题与导航2.2 详情菜单 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中进度条相关的内容,本章回中主要介绍 标题栏。闲话休提,让我们一起Talk Android Jetpack吧! 1. 概念介绍 我们在本章回…

大型公共建筑能耗监测与信息管理系统研究及产品选型

摘要:文章通过阐述大型公共建筑能耗现状,突出大型公共建筑实施节能监管的必要性,并在系统总结运用技术手段实施建筑能耗监测的基础上,介绍了江苏省建筑能耗监测系统研究过程中的技术创新和应用情况。 关键词:公共建筑…

ubuntu20.04 nerf开山之作

源码 GitHub - yenchenlin/nerf-pytorch: A PyTorch implementation of NeRF (Neural Radiance Fields) that reproduces the results. 代码的相关解读 NeRF代码解读-相机参数与坐标系变换 - 知乎 原文题目:NeRF: Representing Scenes as Neural Radiance Field…

yolov5 + openvino + c++测试

1.拉取最新yolov5代码,训练自己数据或者直接用官方pt模型来进行转为openvino的格式,当前已经支持直接把pt模型转为openvino。 我拉取的是:2023-10-03 21:46 dd9e3382c9af9697fb071d26f1fd1698e9be3e04 在export.py代码中把default中加…

Epoch、批量大小、迭代次数

梯度下降 它是 机器学习中使用的迭代 优化算法,用于找到最佳结果(曲线的最小值)。 坡度 是指 斜坡的倾斜度或倾斜度 梯度下降有一个称为 学习率的参数。 正如您在上图(左)中看到的,最初步长较大&#…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程(五)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 今天讲一下wf_demo表单的一些修改 1、demo的实现类修改如下: 主要是增加一个服务名称&#…

全新自适应导航网模板 导航网系统源码 网址导航系统源码 网址目录网系统源码

帝国CMS7.5开发目录网络程序基本功能描述: 1.一键获取目标站SEO信息。7.5版增加了一键获取会员中心网站信息权重,小程序提交发布,增加了新的自适应模板; 2.访客可以提交,访客提交手动审核,会员提交不审核…

Python爬虫:制作一个属于自己的IP代理模块

前言 在Python爬虫过程中,为了避免被网站的反爬虫机制干扰,我们需要使用IP代理。所谓IP代理,就是通过修改网络请求中的IP地址,来达到隐藏真实IP地址的效果。本文将教你如何制作一个自己的IP代理模块,让你的爬虫更加稳…

【JUC】原子操作类及LongAddr源码分析

文章目录 1. 十八罗汉2. 原子类再分类2.1 基本类型原子类2.2 数组类型原子类2.3 引用类型原子类2.4 对象的属性修改原子类2.5 原子操作增强类 3. 代码演示及性能比较:4. LongAddr原理5. LongAddr源码分析5.1 add()5.2 longAccumulate()5.3 sum() 6. 小总结6.1 Atomi…

C++算法前缀和的应用:分割数组的最大值的原理、源码及测试用例

分割数组的最大值 相关知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例:付视频课程 二分 过些天整理基础知识 题目 给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组。 设计一个算法…

VsCode通过Git History插件查看某个页面的版本修改记录

首先需要安装插件Git History 方式一:通过 点击File History 查看某个文件变更;即通过commit的提交记录去查看某个文件的修改 方式二:通过点击选择toggle File Blame 查看当前页面每一行所有提交修改记录

基于nodejs+vue小型企业银行账目管理系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

毫米波雷达模块技术革新:在自动驾驶汽车中的前沿应用

随着自动驾驶技术的快速发展,毫米波雷达模块的技术革新成为推动这一领域的关键因素之一。本文将深入研究毫米波雷达模块技术的最新进展,并探讨其在自动驾驶汽车中的前沿应用。 毫米波雷达模块的基本原理 解释毫米波雷达模块的基本工作原理,强…

springboot+html实现简单注册登录

前端&#xff1a; register.html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>register</title><link rel"stylesheet" type"text/css" href"/css/style.css&…

Unity Ugui 顶点颜色赋值

一、效果图 如下图&#xff1a;图片和文字的颜色都可以渐变&#xff0c;透明度也可以渐变。 原理分析&#xff1a; 不管是图片Image或是文本Text&#xff0c;它们都是网络Mesh来渲染网格是由很多三角形组成&#xff0c;那么我们根据坐标修改三角形的颜色即可实现。 工程源码…

嵌入式面试经典30问

嵌入式面试经典30问 很多同学说很害怕面试&#xff0c;看见面试官会露怯&#xff0c;怕自己的知识体系不完整&#xff0c;怕面试官考的问题回答不上了&#xff0c;所以今天为大家准备了嵌入式工程师面试经常遇到的30个经典问题&#xff0c;希望可以帮助大家提前准备&#xff0…

使用navicat查看类型颜色

问题描述&#xff1a; 最近遇到一个mongodb的数据问题。 在date日期数据中&#xff0c;混入了string类型的数据&#xff0c;导致查询视图报错&#xff1a; $add only supports numeric or date types解决办法&#xff1a; 使用类型颜色工具。 找到在last_modified_date字段中…

iOS 中,isa 指针

每个对象都有 isa 指针&#xff0c;指向对象所属的类。例如类 NSString 其实是类对象。 类对象产生于编译期&#xff0c;单例。 类对象有 isa 指针指向对应元类&#xff0c;元类&#xff08;metaclass&#xff09;中保存了创建类对象以及类方法所需的所有信息。 struct objc_…

Qt事件传播机制 day8

Qt事件传播机制 day8 事件的接受和忽略 当空间忽略事件时&#xff0c;事件会继续往上传播&#xff0c;这里的传播指传播给父组件QEvent有accept()函数与ignore()函数 accept()&#xff1a;本组件处理该事件&#xff0c;这个事件就不会被继续传播给其父组件ignore()&#xff1…