Linux 基础

2023-05-16

Linux 基础

  • 进程
      • 1 进程查看命令 ps、pstree、job
      • 2 进程的状态
      • 3 进程间的关系
        • 3.1 父进程与子进程,frok()、vfrok()
        • 3.2 进程组
        • 3.3 会话
      • 4 进程间通信 IPC
        • 4.1 管道 pipe
        • 4.2 信号

进程

进程,表示程序的运行过程,表示动态的运行。
进程的生命周期。程序运行结束后也就意味着进程终止

  • 进程终止(程序结束)的方式
正常终止:
1main()函数中通过 return 语句返回来终止进程;
2、应用程序中调用库函数 exit()终止进程 
3、应用程序中系统调用_exit()_Exit()终止进程

异常终止:
1、应用程序中调用 abort()函数终止进程;
2、进程接收到一个信号,譬如 SIGKILL 信号。

1 进程查看命令 ps、pstree、job

ps 

ps -aux:列出所有进程和状态
ps -ajx:列出所有进程和状态
ps -ef:列出所有进程
ps -l:列出和当前用户有关的进程和状态
ps -u:用户名:查看某一用户的进程状态
ps -j:列出PID \ SPID 
jobs   查看当前后台的进程状态

jobs -l:除了列出进程号外,同时列出PID
jobs -r:列出仅仅在后台运行的进程
jobs -S:列出仅仅在后台暂停的进程
pstree 进程树

2 进程的状态

Linux 系统下进程通常存在 6 种不同的状态(ps -aux命令可查)

1、R 运行态 和 就绪态 
  运行态 该进程当前正在被 CPU 调度运行 
  就绪态 该进程得到 CPU 调度就会变成 运行态
2、S 可中断睡眠状态(浅度睡眠)
   进程在等待某个事件、资源有效(I\O事件、信号唤醒、中断唤醒)而被系统挂起
3、D 不可中断睡眠状态(深度睡眠)
   进程在等待某个事件、资源有效而被系统挂起,不能被信号、中断唤醒
4、T 停止态。
   表示进程暂停运行,一般可通过信号将进程暂停
5、Z 僵尸态
  该进程已经结束、但其父进程还未给它“收尸”
6、X 死亡态 
首字母跟着的其他字母含义

s  表示当前进程是一个会话首领进程
I  表示当前进程是一个多线程进程
N  表示低优先级
<  表示高优先级
+  表示当前进程处于前台进程组

3 进程间的关系

进程间存在着多种不同的关系:无关系(相互独立)、父子进程关系、进程组、会话

3.1 父进程与子进程,frok()、vfrok()

PID:进程的ID (每一个新进程都有一个唯一的PID)
PPID:父进程的ID
所有进程的父进程: init

getpid()    返回其子进程pid
getppid()   返回其父进程pid
  • 创建子进程 frok()

子进程会拷贝父进程的数据段、堆、栈,并且拷贝父进程打开的所有文件描述符
子进程和父进程各自在自己的进程空间中运行 ,父进程与子进程并不共享这些存储空间

  • 创建子进程 vfrok()
是为了弥补frok() 的缺点,所以引入 vfrok()

fork 创建子进程之后,子进程会拷贝父进程的数据段、代码段、堆栈等
将其拷贝到自己的进程空间中;当子进程调用exec 函数加载一个新的程序时,
新的程序又会替换掉这些拷贝过来的代码段、数据段、堆栈等,
导致之前的拷贝工作白忙活一场,所以也导致在这种情况下,
fork 函数的效率比较低!
  • frok()、vfrok()的区别
区别1

fork 会为子进程创建一个新的地址空间 (也就是进程空间),
子进程几乎完全拷贝了父进程,包括数据段、代码段、堆、栈等;

vfork 函数,子进程在终止或者成功调用exec 函数之前
子进程与父进程共享地址空间,共享所有内存,包括数据段堆栈等

区别2:
fork调用之后,父、子进程的执行次序不确定;父进程概率比子进程概率大

vfork函数会保证子进程先运行,父进程此时处于阻塞、挂起状态,
子进程终止或成功调用exec函数之后,父进程才会被调度运行。

3.2 进程组

PGID:进程组的ID

返回进程组ID
getpgrp()
getpgid(pid号)  

每个进程必定属于某一个进程组、且只能属于一个进程组,每一个进程组有一个组长进程,组长进程的 ID 就等于进程组 ID; 在组长进程的 ID前面加上一个负号即是操作进程组

进程组的生命周期从被创建开始,到其内所有进程终止或离开该进程组;只要进程组中还存在一个进程,则该进程组就存在

3.3 会话

SID:会话ID

返回会话ID 
getpsid(pid号)  

会话是一个或多个进程组的集合

一个会话可包含一个或多个进程组,但只能有一个前台进程组,其它的是后台进程组;每个会话都有一个会话首领(leader),即创建会话的进程

4 进程间通信 IPC

进程间通信 interprocess communication,简称 IPC,指两个进程之间的通信

进程间通信的本质 : 由 OS 参与,提供一份所有进程都可以访问的公共资源

公共资源包括: 内存块、队列、文件等,所以就出现了多种不同的进程间通信的方法

4.1 管道 pipe

  • 匿名管道

匿名管道只能用于 父子进程 或者 具有“血缘关系”的进程之间的通信。

管道是一种单向通信的方法,一个进行向管道写入数据、另一个进程从管道读取数据

管道中的数据 并不存在于磁盘中,是存放在内存中,每一个管道会产生两个文件描述符,用来一读一写

  • 命名管道

命名管道文件存在文件系统中,管道文件有自己的名字,可以向管道中读写数据。所以,命名管道可以作为同一台主机上的任意进程之间进行通信

4.2 信号

信号是事件发生时对进程的通知机制,信号的目的是用来通信的,当发生某种情况下,通过信号将情况“告知”相应的进程,从而达到同步、通信的目的

1、硬件发生异常,即硬件检测到错误条件并通知内核,随即再由内核发送相应的信号给相关进程 

2、终端下输入了能够产生信号的特殊字符
CTRL + C 产生中断信号(SIGINT)
CTRL + Z 产生暂停信号(SIGCONT) 

3kill()系统调用可将任意信号发送给另一个进程或进程组 

4、发生了软件事件,即当检测到某种软件条件已经发生,
进程所设置的定时器已经超时、进程执行的 CPU 时间超限、进程的某个子进程退出等等情况)

信号的处理方式

1、忽略信号。当信号到达进程后,有两种信号却决不能被忽略,它们是 SIGKILL  和 SIGSTOP

2、捕获信号。当信号到达进程后,执行预先绑定好的信号处理函数。
为了做到这一点,要通知内核在某种信号发生时,执行用户自定义的处理函数

3、执行系统默认操作。进程不对该信号事件作出处理,而是交由系统进行处理
每一种信号都会有其对应的系统默认的处理方式, 对大多数信号来说,系统默认的处理方式就是终止该进程
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 基础 的相关文章

  • 安装 Pillow 错误:安装脚本退出并出现错误:命令“x86_64-linux-gnu-gcc”失败,退出状态为 1

    当我尝试安装 Pillow 2 5 3 时 我收到错误 命令 x86 64 linux gnu gcc 失败 退出状态为 1 这是所发生事件的完整日志 http pastebin com 5k2TsyJY 我需要这个库作为另一个 pytho
  • POSIX:FreeBSD 与 Linux 中的管道系统调用

    在 Linux 2 6 35 22 generic 中 man pipe指出 pipeline 创建一个管道 一个可用于进程间通信的单向数据通道 在 FreeBSD 6 3 RELEASE p5 中 man pipe指出 pipeline
  • 查找系统日志最大消息长度

    大多数 Unix 程序员都会习惯由syslog h 并且许多实现 例如 glibc 对发送给它的 syslog 消息的大小没有真正的限制 但通常对侦听的应用程序有限制 dev log 我想知道是否有人知道如何找到系统日志的最大消息大小 或者
  • Linux 缓冲区溢出环境变量

    我一直在审查不同类型的缓冲区溢出 并遇到了一个我不记得为什么会发生的问题 下面的代码是我尝试执行缓冲区溢出的程序 include
  • 如何永久清除 linux/ubuntu 终端或 bash 中的所有历史记录? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 当您在 Linux 终端中使用向上键时 可以再次使用之前的命令 很棒的功能 但是 我开始使用命令中的敏感详细信息将 mysql 记录到 mysql 中
  • 保护一个保存 MySQL 数据库的简单 Linux 服务器?

    这是一个初学者问题 但我浏览了该网站上的许多问题 但没有找到简单直接的答案 我正在设置一个运行 Ubuntu 的 Linux 服务器来存储 MySQL 数据库 该服务器尽可能安全非常重要 据我所知 我主要担心的是传入的 DoS DDoS 攻
  • 为什么我的 Java 代码执行 bash 命令不正确?

    我试图让我的 Java 程序与 Linux bash 交互 但出了问题 我有一个简单的可执行文件prog从中读取一个整数stdin并输出其平方 执行中 echo 5 prog 从 bash 本身打印正确答案25 in stdout但运行 i
  • 验证 BASH 脚本时出现问题 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试验证 bash 脚本时出现代码 lint 错误 bin bash if eq 0 then printf No argum
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • GCC 4.7 字符串文字的源字符编码和执行字符编码?

    Linux x86 64 上的 GCC 4 7 是否具有默认字符编码 用于验证和解码 C 源文件中字符串文字的内容 这是可配置的吗 此外 当将字符串数据从字符串文字链接到输出的数据部分时 它是否具有默认的执行字符编码 这是可配置的吗 在任何
  • 更改 Amazon RDS MYSQL Linux 服务器的 innodb_log_file_size 变量值

    我们正在使用 Amazon RDS linux 服务器作为 MYSQL 更改 my cnf 文件变量值的方法是什么 我正在尝试更改 innodb log file size 变量 您能告诉我哪一个是最好的改变方式吗 所以请帮我解决这个问题
  • 在 Linux 中使用仅限 CLI 的工具生成磁盘使用情况图/图表

    在这个问题中 https stackoverflow com questions 32230 tracking down where disk space has gone on linux有人询问如何在 Linux 中显示磁盘使用情况 我
  • 如何在 Linux 上调用 Python 中的内联机器代码?

    我正在尝试从 Linux 上的纯 Python 代码调用内联机器代码 为此 我将代码嵌入到字节文字中 code b x55 x89 xe5 x5d xc3 然后打电话mprotect http www kernel org doc man
  • 使用openssl从服务器获取证书

    我正在尝试获取远程服务器的证书 然后可以将其添加到我的密钥库中并在我的 Java 应用程序中使用 一位高级开发人员 正在度假 告诉我我可以运行这个 openssl s client connect host host 9999 获取转储的原
  • 套接字发送并发保证

    如果我在两个进程 或两个线程 之间共享一个套接字 并且在这两个进程中我尝试发送一条阻塞的大消息 大于下划线协议缓冲区 是否可以保证这两个消息将按顺序发送 或者消息可以在内核内部交错吗 我主要对 TCP over IP 行为感兴趣 但了解它是
  • 数百个空闲线程的影响

    我正在考虑使用可能数百个线程来实现通过网络管理设备的任务 这是一个在带有 Linux 内核的 powerpc 处理器上运行的 C 应用程序 在每个任务进行同步以将数据从设备复制到任务的初始阶段之后 任务变得空闲 并且仅在收到警报或需要更改一
  • bash 或 sh 中的“=”和“==”运算符有什么区别

    我意识到 和 运算符都可以在 if 语句中使用 例如 var some string if var some string then doing something fi if var some string then doing some
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • C中的内存使用问题

    请帮忙 操作系统 Linux 其中 sleep 1000 中 此时 top 显示Linux任务 给我写了7 7 MEM使用 valgrind 未发现内存泄漏 我明白 写得正确 所有 malloc 结果都是 NULL 但是为什么这次 睡眠 我
  • 从 Java 读取 /dev/input/js0

    我正在尝试阅读 dev input js0来自Java 但我不断得到 java io IOException Invalid argument at java io FileInputStream read0 Native Method a

随机推荐

  • 在Windows上搭建http服务器(lighttpd)------中秋节大礼

    今天中秋节 xff0c 也算忙了一大天了 窗外月圆 xff0c 我是不是也该吟诵 露从今夜白 xff0c 月是故乡明 这样的佳句呢 xff1f 还好 xff0c 过几天国庆就要回家了 今天继续来聊聊http服务器吧 xff01 在前面的文章
  • EPG简介

    一 EPG简介 电子节目指南 Electronic Program Guide xff0c EPG xff0c 是指在符合MPEG 2 13818 1 的TS传输流中插入DVB标准定义的业务信息 Service Information xf
  • ROS学习笔记(五)

    本文是关于第14讲的学习内容总结 所以要完成的目标是 xff0c 用C 43 43 代码编程实现服务端 Server的作用就是给海龟发布指令的 xff0c Client的作用是来控制Server是否要给海龟发布指令 老师的解释是Client
  • 433M数传电台窄带无线通讯技术手册

    一 模块介绍 1 1特点介绍 E3A DTU 500 是 一款 频率 433M 无 线数传电 台 xff08 同时 具有RS232 RS485 接口 xff09 xff0c 透明传输方式 xff0c 工作在 425 450 5MHz 频段
  • [C++]按字节读取文件

    一 背景 本文介绍了如何使用C 43 43 按字节读取 txt文件 本文第二部分为代码实例和对代码的解释 xff0c 第三部分为本文的参考文章 二 代码实例 span class token macro property span clas
  • [STL]priority_queue多种方式自定义排序

    一 背景 在做leetcode题目时很多题都需要使用优先队列 xff08 堆 xff09 xff0c 并需要使用自定义数据类型 自定义有限队列的排序方式 本文对priority queue的自定义排序方式做了总结 本文可能并不能覆盖所有自定
  • [Pyplot] 绘制三维散点图使用颜色表示数值大小

    一 摘要 在进行数据可视化时 xff0c 对于一元函数f x 61 y数据我们可以使用二维平面图显示 xff0c x轴表示自变量 xff0c y轴表示函数值 xff1b 对于二元函数f x y 61 z数据我们也可以使用三维图可视化 xff
  • [C++]<numeric>头文件介绍

    一 摘要 C 43 43 的 lt numeric gt 头文件中包含了一系列可用于操作数值序列 xff08 sequences of numeric value xff09 的函数 xff0c 通过修改函数的参数类型也可以将这些函数应用到
  • [算法] 使用位运算遍历集合的子集

    一 简介 对于使用状态压缩方法表示的集合A xff0c 如何遍历使用位运算遍历集合A的所有子集 二 代码与注释 0 符号假设 假设全集为S S的元素个数为n A为集合S的子集 可以使用状态压缩方法加位运算表示集合A 例如 xff1a S 6
  • [LaTeX|翻译]What are .cls and .sty files? How are they different?

    什么是 cls和 sty文件 xff1f 它们的区别是什么 xff1f What are cls and sty files How are they different 通常来讲 xff0c cls和 sty文件是用于增强LaTeX功能的
  • [Pyplot] 绘制3D曲面+自定义面片颜色

    一 背景 使用python 43 matplotlib实现绘制3D曲面 xff08 由多个小面片组成 xff09 xff0c 支持自定义面片颜色 xff1b 实现效果如图 a b 所示 xff1a a 使用面片法向作为面片颜色 b 使用默认
  • [STL]使用vector::erase对vector遍历删除

    在对vector中的元素进行遍历删除时遇到了一点问题 xff0c 查博客发现博客上并不靠谱 在此记录 xff0c 共同进步 vector循环遍历正确代码 span class token keyword for span span clas
  • 判断一个数是不是质数(素数),3种方式介绍

    本文参考博文判断一个数是不是质数 素数 xff0c 3种方式介绍 xff0c 原文章解释的已经很详细 xff0c 本问增加部分博主自己的理解 一 概念介绍 质数 xff1a 质数是指在大于1的自然数中 xff0c 除了1和它本身以外不再有其
  • Ubuntu/Arm安装Mysql报错:mysql-server 依赖于 mysql-server-5.7;然而:软件包 mysql-server-5.7 尚未配置。

    报错内容如下 xff1a dpkg 依赖关系问题使得 mysql server 的配置工作不能继续 xff1a mysql server 依赖于 mysql server 5 7 xff1b 然而 xff1a 软件包 mysql serve
  • E90-DTU系列无线数传电台网关与节点4gDTU通信教程

    以E90 DTU 400SL22 ETH 与E90 DTU 400SL22 为例实现网关与节点进行数据交换 xff0c 其它频段或功率的网关 节点 xff0c 其操作方式与该视频教程一致 第一步 安装网关 为网关安装天线电源模块 第二步 调
  • STM32实现将printf重定向到串口的3种方法

    STM32实现将printf重定向到串口的3种方法 目录 STM32实现将printf重定向到串口的3种方法一 使用MicroLib重定向printf二 不使用MicroLib重定向printf三 使用标准库自定义printf 函数到串口1
  • 时钟传感器—DS3231

    时钟传感器 DS3231 DS3231概述DS3231引脚DS3231寄存器DS3231 操作 DS3231概述 DS3231是一款高精度I2C实时时钟器件内部带温度补偿 闰年补偿提供两个可编程日历闹钟提供秒 分 时 星期 日期 月 年等信
  • C语言进阶

    C语言进阶 数据操作1 数据修饰 auto static register const volatile2 大端模式 小端模式 内存操作1 动态内存管理 xff08 堆区 heap xff09 malloc calloc realloc f
  • 虚拟机VMware:由于找不到vcruntime140_1.dll,无法继续执行代码

    最近换了台新电脑 xff0c 就开始安装虚拟机VMware xff0c 就发现虚拟机开机的时候 xff0c 弹出了一个错误 xff0c 下图 于是 xff0c 百度了一下缺少vcruntime140 1 dll xff0c 如何解决 解决方
  • Linux 基础

    Linux 基础 进程1 进程查看命令 ps pstree job2 进程的状态3 进程间的关系3 1 父进程与子进程 xff0c frok vfrok 3 2 进程组3 3 会话 4 进程间通信 IPC4 1 管道 pipe4 2 信号