初步认识系统调用

news2024/12/23 14:02:37

目录

    • 前言
    • 一、什么是进程?
        • 1、进程与程序的区别?
        • 2、什么是进程的控制块
    • 二、什么是系统调用?
    • 三、认识几个比较简单的系统调用接口
        • 1、查看进程
        • 2、获取进程的pid/ppid
          • (1).getpid/getppid
          • (2)getpid/getppid的使用
        • 3、创建进程的方法
    • 总结

前言

之前我们学习的都是Linux中的一些基本的操作和基本的概念,从现在开始,我们要开始接触系统中的一些知识,我们学习Linux操作系统,本质就是要学习其中的系统编程,而系统编程主要就是要学习其中的系统调用接口,因此,我们可以发现,系统调用对于我们来说是非常重要的一项技能,那么从现在开始就让我们开始接触系统调用的相关知识吧!!!

一、什么是进程?

在操作系统中存在一个非常重要的概念,就是进程,很多教材都没有办法讲清楚什么是进程,有的教材说就是当一个程序载入内存时,并上处理机运行的时候就称之为一个进程,或者说形成了一个进程,实际上,在系统中是存在无数的进程的,进程的数量是非常非常多的,那么操作系统就必须将这些进程进行好好地管理,这就是所谓的进程管理。那么问题来了,操作系统是如何对进程进行管理的呢??是直接对运行的程序进行管理吗??显然不是的,首先我们需要知道,在操作系统中,我们需要为每一个进程维护一个数据结构,这个数据结构中应该存放进程的所有相关的信息及属性,比如常见的:进程的pid,进程的状态等等。那么操作系统就是通过每一个进程的数据结构对进程进行管理,我们知道,系统中的进程数量很多,所以直接对进程的数据结构进行管理的话同样也是一件令人头疼的事情,因此我们需要将这些管理对应进程的数据结构先组织起来,让他们有机地组合起来形成一种数据结构,比如常见的可以形成双链表,那么操作系统对这些数据结构的管理就可以转换为对这些链表进行增删查改,因此,我们来回想一下一个程序在形成到被处理机运行的整个过程:首先应该由对应的专业人员将程序文件写好并进行编译形成可执行程序,此时这个可执行程序所处的位置是磁盘,然后当这个程序要进行运行的时候就应该载入内存,根据上面所描述的,操作系统需要为载入内存的程序创建一个数据结构这个结构中应该存放相应进程的相关属性信息,创建好之后,这个结构就会放到相应的运行队列中准备上处理机进行运行,这个过程就是一个进程的形成过程,所以很明显一个进程所包含的部分应该有两个部分:程序本身的代码和数据和操作系统为之创建的存放进程相关属性信息的结构体(PCB)

1、进程与程序的区别?

  • 程序:当程序员写好代码之后在编译器上进行编译通过之后形成的文件就称为可执行程序,这个时候可执行程序存放的位置是磁盘
  • 进程:当程序想要被运行的时候需要载入内存,操作系统为之创建一个结构体,这个过程就是进程的形成过程,因此,进程包含程序本身的代码和数据以及管理程序的结构体

2、什么是进程的控制块

操作系统为方便管理内存中的进程而为其创建的结构体,这个结构体中存放大量对应进程的相关属性信息,后面我们会着重进行讲解,也会学习很多获取这个结构体中的属性的相关的系统调用接口,这个结构体称之为进程控制块(PCB),再Linux中,这个结构体有一个具体的称号:task_struct

二、什么是系统调用?

因为操作系统使用起来成本比较大,一般情况人们很难直接对操作系统进行操作,我们知道,操作系统是一款能够管理软硬件资源的软件,它能够合理地管理系统中的软硬件资源,使它们能够正常地为我们提供服务。操作系统为了能够让人们容易地使用系统中的资源,所以操作系统提供了一系列的系统调用接口让我们去调用,我们需要什么服务就可以对应地调用对应的接口就可以完成相应的服务了,这些系统调用接口本质是用C语言写的C语言函数,因为,Linux就是用C语言写的一款操作系统,注意:这里的系统调用和我们平时在写C语言程序时调用的C语言库函数是不一样。

三、认识几个比较简单的系统调用接口

1、查看进程

  1. 方法一:ps指令
    当一个程序运行起来之后,那么在系统中就会有相应的进程形成,那么我们应该怎么查看这个进程呢??我们可以使用ps指令+ajx选项进行查看系统中的进程,需要注意的是:单纯使用ps -ajx命令进行查看系统中的进程的话,会显示出系统中的所有进程,那么就不利用查看我们自己的进程
    那么如果想要查看我们自己的进程应该结合grep指令进行查看,如果我们当前的可执行程序叫做process,那么我们可以采用指令ps -ajx|grep process,这样就可以将我们自己的进程筛选出来。
    当我们用上面的命令进行操作的时候,带出来的结果还默认具有grep指令,那么如果想要去掉grep指令,我们可以采用:ps -ajx|grep process|grep -v grep,用于去掉grep进程
    在这里插入图片描述
  2. 方法二:proc(内存文件系统)
    存在的路径:
    在这里插入图片描述
    在这里首先我们需要明确一个点:就是一个进程的pid,这个是每一个进程所独有的,就像每一个人都具有独立的身份证号一样,是标识一个进程中的重要信息,proc就是通过一个进程的pid来查看进程,常见的命令:ls /proc/进程的pid,比如:ls /proc/1234,1234为一个进程的pid,如果我们想要查看这个进程的目录,可以加上-d选项,就是:ls /proc/1234 -d,还能够显示出进程中的其他信息,可以加上-al选项,比如:ls /proc/1234 -al,这里面包含这个进程中的可执行程序文件和这个进程的工作目录。
  • ls /proc/进程的pid:查看进程中的文件

在这里插入图片描述

  • ls /proc/进程pid -d:查看进程的目录

在这里插入图片描述

  • ls /proc/进程pid -al:查看进程的其他信息
    在这里插入图片描述

2、获取进程的pid/ppid

(1).getpid/getppid
  • getpid:获取进程的pid
  • getppid:获取进程的ppid
(2)getpid/getppid的使用

在这里插入图片描述
这两个系统调用接口需要在C语言源文件中加入,加入的时候需要包含两个头文件:

#include <sys/types.h>
#include <unistd.h>

结果显示:
在这里插入图片描述
源代码:
在这里插入图片描述

3、创建进程的方法

使用fork()
在这里插入图片描述
关于fork()的返回值?
本来在系统中会存在一个进程,这个进程调用fork()之后就会成功创建一个子进程,现在系统中就有两个进程了,返回值的话就是fork()会给子进程返回0,给父进程返回子进程的pid,如果创建进程失败,则会给父进程返回-1
实验验证fork()调用之后确实有两个返回值
在这里插入图片描述
我们可以利用fork()函数的两个返回值让父子进程做不同的事

在这里插入图片描述
源代码
在这里插入图片描述
为什么fork()成功创建子进程之后是给父进程返回子进程的pid,给子进程返回0?
因为一个进程只有一个父进程,而一个进程可能有多个子进程,因此,通过父进程去找对应的子进程的成本就会相对而言比较大,通过子进程去找父进程的成本相对而言就会比较小,直接通过getppid()系统调用接口就可以找到其父进程了,因此子进程最重要的是要知道自己已经被创建成功,父进程就需要子进程的pid从而才能够对号入座找到对应的子进程

总结

今天主要认识了系统调用,学习了利用ps -ajx+grep指令和内存文件系统proc来查看进程,使用getpid()和getppid()来获取进程的pid和ppid,使用fork()来创建子进程

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

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

相关文章

Redis系列:Redis持久化机制与Redis事务

Redis 是个基于内存的数据库。那服务一旦宕机&#xff0c;内存中数据必将全部丢失。所以丢失数据的恢复对于 Redis 是十分重要的&#xff0c;我们首先想到是可以从数据库中恢复&#xff0c;但是在由 Redis 宕机时&#xff08;说明相关工作正在运行&#xff09;且数据量很大情况…

LeetCode刷题记录01

1704判断字符串的两半是否相似序题目我的思路我的代码提交结果其他解简述思路提交结果总结序 我的日常碎碎念&#xff1a;今天下班在看综艺&#xff0c;看到群里班长开了个会议&#xff0c;于是决定开始学习&#xff0c;他说今天的每日一题好简单&#xff0c;让我也去刷一下。嗯…

数组的定义与使用

文章目录数组的基本概念为什么要使用数组什么是数组数组的创建及初始化数组的创建数组的初始化数组的使用数组中元素的访问遍历数组数组是引用类型基本数据类型与引用类型变量的区别认识null数组的应用场景保存数据作为函数的参数参数传基本数据类型参数传数组类型作为函数的返…

TFN T6300A 网络综合测试仪 以太网数据 千兆以太网测试仪 OTDR E1 PRI V.35/V.24 光功率计一体机

一款功能强大、便携式、方便使用、价格便宜的高性价比手持式以太网测试仪是企业中网络管理和维护人员的刚需仪器。好的以太网测试仪可以帮助工作人员迅速解决网络不通、网速慢、丢包、延迟等问题。 当今以太网测试仪市场参差不齐&#xff0c;说的功能一个比一个强&#xff0c;…

你的第一个基于Vivado的FPGA开发流程实践——二选一多路器

你的第一个基于Vivado的FPGA开发流程实践——二选一多路器 1 原理图 2 开发流程 首先我们先打开安装好的Vivado软件 创建一个文件 选择你的开发板 创建一个源文件 现在我们就可以根据原理使用Verilog代码实验这个功能了 module mux2( //端口列表a,b,sel,out);//交代端口类…

RabbitMQ第二个实操小案例——WorkQueue

文章目录RabbitMQ第二个实操小案例——WorkQueueRabbitMQ第二个实操小案例——WorkQueue 讲第二个案例之前&#xff0c;我们先看下前面第一个案例的模型&#xff1a; 可以看到&#xff0c;我们只有一个发布者和一个消费者&#xff0c;通过Queue队列&#xff0c;实现最简单的消…

02 【nodejs开发环境安装】

02 【nodejs开发环境安装】 1.版本介绍 在命令窗口中输入 node -v 可以查看版本0.x 完全不技术 ES64.x 部分支持 ES6 特性5.x 部分支持ES6特性&#xff08;比4.x多些&#xff09;&#xff0c;属于过渡产品&#xff0c;现在来说应该没有什么理由去用这个了6.x 支持98%的 ES6 特…

e智团队实验室项目-第三周-经典的卷积神经网络的学习

e智团队实验室项目-第三周-卷积神经网络的学习 赵雅玲 *, 张钊* , 李锦玉&#xff0c;迟梦瑶&#xff0c;贾小云&#xff0c;赵尉&#xff0c;潘玉&#xff0c;刘立赛&#xff0c;祝大双&#xff0c;李月&#xff0c;曹海艳&#xff0c; (淮北师范大学计算机科学与技术学院&am…

【树莓派不吃灰】基础篇⑱ 从0到1搭建docker环境,顺便安装一下emqx MQTT Broker、HomeAssistant、portainer

目录1. 前言2. 搭建docker环境3. docker简介3.1 docker解决什么问题&#xff1f;3.2 docker VS vm虚拟机3.2.1 vm虚拟机3.2.2 docker3.3 docker如何解决问题&#xff1f;3.4 docker运行架构3.4.1 镜像 : image3.4.2 容器 : container3.4.3 仓库 : repository3.5 国内镜像加速3.…

python easygui怎么修改默认按钮名字

1.执行以下代码找到easygui安装位置 import easyguiprint(easygui.__file__)2.打开上述路径下boxes文件夹下需要修改的组件 如此时想要修改选项栏的默认按钮名字 则打开choice_box.py文件 执行如下图 可以看到有Cancel、SelectALL、ClearALL、OK四个默认按钮&#xff0c;可否…

Linux下动静态库的制作与使用

学习导航一、关于动静态库的基本认识二、设计库的工程师角度(1)制作静态库(2)制作动态库二、使用库的用户角度(1)使用静态库(2)使用动态库三、理解的角度一、关于动静态库的基本认识 1.静态库 静态库以 .a 作为文件后缀程序在编译链接的时候&#xff0c;将静态库的代码拷贝到…

[TCP/IP] Linux 搭建服务器局域网

文章目录[TCP/IP] Linux 搭建服务器局域网1. 使用python内置库http.server2. 使用Http-Server[TCP/IP] Linux 搭建服务器局域网 1. 使用python内置库http.server python3: http.server 命令行启动&#xff1a; # python 3 python -m http.server 8000 # python 2 python -m S…

ZYNQ_FPGA_SPI通信协议多种实现方式

文章目录PLPSSPIGPIOAXI-GPIOAXI-Quad-SPI&#xff08;待测试&#xff09;本文记录一下在使用AD9363中的SPI通信问题&#xff0c;同时针对在ZYNQ系列开发板上实现SPI的方法做一个总结。ZYNQ系列包含了PL端和PS端&#xff0c;因为本科阶段有一定的ARM的开发经验&#xff0c;便想…

2022年,软件测试已经不吃香了吗?

最近因为疫情等各种原因&#xff0c;大厂裁员&#xff0c;失业等等频频受到关注。 不解释&#xff0c;确实存在&#xff0c;各行各业都很难&#xff0c;但是&#xff0c;说软件测试行业不吃香&#xff0c;我还真不认同&#xff08;不是为培训机构说好话&#xff0c;大环境不好…

JVM从入门到入魔,这份JVM必知必会的完整版带你彻底玩懂JVM

市面上各类 JVM 相关的资料虽多如牛毛&#xff0c;但是明显都很难让大家系统性地学明白&#xff0c;同时一线大厂技术面试现在 JVM 知识也是必考科目。 在大厂摸爬滚打 10 多年的 Java 高级技术专家全面梳理了系统化学习 JVM 的知识和经验&#xff0c;从入门到入魔&#xff0c…

位运算常用技巧以及练习

几个有趣的操作 利用或操作|和空格将英文字符转换成小写 // 可以变成小写i : a | fmt.Printf("%c\n", i)j : A | fmt.Printf("%c\n", j)利用与操作&和下划线把英文字符转换成大写 // 可以变成大写m : b & _n : B & _fmt.Printf("%c\n…

大数据ClickHouse进阶(二十七):ClickHouse服务监控

文章目录 ClickHouse服务监控 一、系统表 1、metrics 2、events 3、asynchronous_metrics

【爬虫系列】Python 爬虫入门(2)

接上篇&#xff0c;继续梳理 Python 爬虫入门的知识点。这里将重点说明&#xff0c;如何识别网站反爬虫机制及应对策略&#xff0c;使用 Selenium 模拟浏览器操作等内容&#xff0c;干货满满&#xff0c;一起学习和成长吧。 1、识别反爬虫机制及应对策略 1.1 测试网站是否开启…

项目中如何配置 Maven 为国内源

目录 1. 创建出一个 Maven 项目 2. 打开项目配置界面, 检查并配置国内源 2.1 打开配置界面 (当前项目界面和新项目配置界面) 2.2 搜索 "Maven" 2.3 设置 setting.xml (给此 xml 中添加国内源) 2.4 把上面的步骤 (2.1~2.3) 在新项目的配置界面中重新配置一遍. …

【MySQL】MySQL事务隔离机制与实现原理详解(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…