【Linux】多进程基础

文章目录

    • 查看进程相关命令
    • 进程相关函数
    • 孤儿进程
    • 僵尸进程
    • 进程回收
    • 进程通信(IPC)
      • 匿名管道pipe通信的使用
      • 有名管道:FIFO

查看进程相关命令

  • ps -ef: System V 风格查询所有的进程信息,-e 参数表示显示所有进程,-f 表示使用全格式输出,包含更多的列信息。输出是静态的,即显示的是执行命令那一刻的快照。
  • ps aux/ajx:BSD 风格查询所有进程信息其中 aux 是一个快捷方式,等同于 -a -u -x,a 表示所有用户的所有进程,j 添加了作业控制相关信息,而 x 显示没有控制终端的进程,u则显示进程的详细信息。
  • top:实时监视进程信息
  • kill:并非杀死进程,而是给进程发送一个信号
  • kill -l:列出所有信号
  • kill -9:杀死进程 kill -9 进程ID(PID)

进程相关函数

  • 每个进程都由唯一进程号来标识,其类型为pid_t(int整形),当某个进程终止后回收该进程号,可以分配给其他进程使用。
  • 除init进程外,任何进程都是由另一个进程创建的,该进程为父进程,对应的进程号为父进程号(PPID),被创建的进程为其子进程。
  • 进程组是一个或者多个进程的集合,互相关联,进程组可以接收同一终端的信号,关联的进程有一个进程组号(PGID)
pid_t getpid(void);//获取进程号
pid_t getppid(void);//获取父进程号
pid_t getpgid(pid_t pid);//获取进程的组进程号
  • 进程创建函数fork():调用 fork()后,会创建一个与父进程状态几乎一致的子进程。但子进程与父进程采用读时共享、写时复制的策略,在fork()后父进程和子进程共享同一个虚拟地址空间映射(页表),映射到同一物理地址。只有在父进程或子进程需要进行写入操作时才会为相应的进程分配物理地址空间,从而使各自进程拥有各自的地址空间。子进程也可以创建其新的子进程。fork()会返回两次,通过返回的pid判断是父进程还是子进程,返回值>0为父进程,==0为子进程,交替抢CPU使用。
#include <sys/types.h>
#include <iostream>
#include <unistd.h>
int main(){int num=10;//创建子进程pid_t pid=fork();//如果使用循环创建多个子进程一定注意,只让父进程创建,对于创建的子进程不做处理即需要判断if(pid==0){break;}//判断父进程还是子进程if(pid>0){std::cout<<"父进程"<<getpid()<<std::endl;num+=10;std::cout<<num<<std::endl;}//判断子进程else if(pid==0){std::cout<<"子进程"<<getpid()<<"父进程"<<getppid()<<std::endl;num+=100;std::cout<<num<<std::endl;}return 0;
}
  • 进程退出函数
#include <stdlib.h>//c语言的进程退出,通过调用Linux的进程退出来实现,并且引入了缓冲区,同c的文件IO函数fopen和fclose也是调用Linux的文件IO函数
void exit(int status)#include <unistd.h>//Linux的进程退出
void _exit(int status)

孤儿进程

  • 父进程结束但是子进程还在运行,该子进程就叫孤儿进程,孤儿进程的父进程会被init进程替代,由init进程对其资源进行释放操作,无危害。

僵尸进程

  • 每个进程结束后用户区的数据可以自行释放,而内核区的PCB需要父进程释放,如果子进程终止,但父进程没有对其内核区的PCB进行回收,子进程的资源残留在内核中,变成僵尸进程,一直占用PID等资源且无法被kill -9杀死,只有杀死其父进程使其变成孤儿进程最后才能被init进程回收。

进程回收

  • 父进程通过调用wait()或waitpid()函数进行进程的回收,二者不同的是前者会阻塞等待进程结束,而后者可以设置WNOHANG不阻塞且waitpid()可以指定等待哪个子进程结束,一次调用只能清理一个子进程。

进程通信(IPC)

  • 管道通信pipe:例如常见的管道符|就是管道通信,ps -ef | grep ssh,将前一个指令的输出作为后一个指令的输入,管道通信是单向的半双工通信,一端读另一端写。管道实际是内存维护的一片缓冲区,可以使用操作文件的方式操作管道,使用文件描述符fd以及open()、close()、read()和write()

匿名管道pipe通信的使用

创建管道
#include <unistd.h>
int pipe(int pipefd[2]);
//包括读端pipefd[0]和写端pipefd[1]
//如果成功创建管道,pipe()函数返回0。若出现错误(比如资源不足),则返回-1,并用perror输出。//创建管道
int pipefd[2];
int ret=pipe(pipefd);
if(ret==-1){perror("pipe");return 0;
}//读管道,类似读文件
....
close(pipefd[1]);//关闭写端
char buff[1024]={0};
while(1){
int len=read(pipefd[0],buff,sizeof(buff));
if(len==0){break;
}
}
....//写管道,类似写文件
....
close(pipefd[0]);//关闭读端
const char *str="HELLO!HAHAHA!" ;
write(pipefd[1],str,sizeof(str));
....
  • 匿名管道只能在有公共祖先的进程下使用,因为父进程fork()后,其子进程都共享父进程的虚拟地址空间映射,包括文件描述符表,其中包含读端pipefd[0]和写端pipefd[1],所以才能进行通信。同时因为半双工通信,读进程需要关闭写端close(pipefd[1]),写进程需要关闭读端close(pipefd[0])
  • ulimit -a:查看管道缓冲的大小

有名管道:FIFO

  • 通过创建管道名称(实则是文件作为管道),可以用于无关系之间的进程的通信,也是通过文件描述符和文件IO进行操作。
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
//pathname:一个指向包含命名管道路径名的字符串指针。
//mode:指定命名管道的权限位,类似于普通文件的权限设置。
//如果成功创建命名管道,返回0。如果失败则返回-1,并设置errno变量//创建管道test
int ret=mkfifo("test",0664);
if(ret==-1){perror("管道创建错误");return 0;
}//只写打开管道即关闭读端,类似打开文件操作。
int fd=open("test",O_WRONLY);
if(fd==-1){perror("open");return 0;
}
//写管道,类似写文件
....
const char *str="HELLO!HAHAHA!";
write(fd,str,sizeof(str));
....//只读打开管道即关闭写端,类似打开文件操作。
int fd=open("test",O_RDONLY);
if(fd==-1){perror("open");return 0;
}
//读管道,类似读文件
....
char buff[1024]={0};
while(1){
int len=read(fd,buff,sizeof(buff));
if(len==0){break;
}
}
....

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

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

相关文章

Apipost IDEA 插件使用说明

Apipost Helper作为IDEA插件&#xff0c;可以快速生成和查询API文档&#xff0c;直观友好地在IDE中调试接口。它简化了开发流程并提升效率&#xff0c;即使新手也能够迅速掌握。Apipost Helper提供了诸多便捷功能&#xff0c;如通过代码查找接口或者通过接口查找代码等&#xf…

java反射机制及beanUtils的实现原理

目录 1.反射机制说明 2.VO,DTO,PO的说明 3.beanUtils的实现原理 4.beanUtils的简单示例 1.反射机制说明 Java的反射机制允许程序在运行时检查和操作类、方法、字段等结构。通过反射&#xff0c;可以动态地创建对象、调用方法、获取/设置字段的值&#xff0c;而无需在编译时…

LLM主要类别架构

LLM主要类别架构介绍 LLM主要类别 LLM本身基于transformer架构。自2017年&#xff0c;attention is all you need诞生起&#xff0c;transformer模型为不同领域的模型提供了灵感和启发。基于原始的Transformer框架&#xff0c;衍生出了一系列模型&#xff0c;一些模型仅仅使用e…

分享一篇压箱底的融合通信技术方案

随着信息技术的发展和通信行业的变革&#xff0c;传统的电信、互联网和移动通信等领域开始融合&#xff0c;形成了融合通信的概念。借助5G、物联网、云计算和大数据等新技术的不断涌现&#xff0c;融合通信技术迎来大发展&#xff0c;在各行各业中有重要应用&#xff0c;融合通…

机床测头助力零部件自动化生产

随着国内制造业朝着自动化、智能化方向快速发展&#xff0c;产品质量检测也由过去的脱机、人工检测方式向在线自动检测转变&#xff0c;作为在线检测的重要工具&#xff0c;机床测头在制造业自动化生产过程中发挥着非常重要的作用。 1.自动化检测与防呆&#xff1a;机床测头可以…

Python面试宝典:Python中与代码性能优化相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第二十一章:代码性能优化:第一节:代码性能优化】 第二十一章:代码性能优化第一节:代码性能优化1. 使用内置数据类型2. 利用列表推导式和生成器表达式3. 使用局部变量4. 减少函数调用…

102.网络游戏逆向分析与漏洞攻防-ui界面的设计-反隐身功能的界面设计与实现(有不使用MFC生成,自己手写代码创建复选框与事件的例子)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

经典JS面试题——数组去重

文章目录 一、双指针二、filter方法三、includes四、indexOf五、reduce()六、set 一、双指针 基本思想&#xff1a;遍历数组&#xff0c;两层for循环比较元素是否相等&#xff0c;相等就删除重复元素。 代码如下 for(var i0;i<arr.length;i) {for(var ji1;j<arr.length…

Keras深度学习框架实战(5):KerasNLP使用GPT2进行文本生成

1、KerasNLP与GPT2概述 KerasNLP的GPT2进行文本生成是一个基于深度学习的自然语言处理任务&#xff0c;它利用GPT-2模型来生成自然流畅的文本。以下是关于KerasNLP的GPT2进行文本生成的概述&#xff1a; GPT-2模型介绍&#xff1a; GPT-2&#xff08;Generative Pre-trained …

EMQX Enterprise 5.7 发布:新增会话持久化、消息 Schema 验证、规则引擎调试与追踪功能

EMQX Enterprise 5.7.0 版本现已正式发布&#xff01; 在这个版本中&#xff0c;我们引入了一系列新的功能和改进&#xff0c;包括会话持久化、消息 Schema 验证、规则引擎调试与追踪测试等功能。此外&#xff0c;新版本还进行了多项改进以及 BUG 修复&#xff0c;进一步提升了…

项目-双人五子棋对战: websocket的讲解与使用 (1)

项目介绍 接下来, 我们将制作一个关于双人五子棋的项目, 话不多说先来理清一下需求. 1.用户模块 用户的注册和登录 管理用户的天梯分数, 比赛场数, 获胜场数等信息. 2.匹配模块 依据用户的天梯积分, 实现匹配机制. 3.对战模块 把两个匹配到的玩家放到同一个游戏房间中, 双方通…

Linux_应用篇(15) 输入设备应用编程

本章学习输入设备的应用编程&#xff0c;首先要知道什么是输入设备&#xff1f; 输入设备其实就是能够产生输入事件的设备就称为输入设备&#xff0c; 常见的输入设备包括鼠标、键盘、触摸屏、按钮等等&#xff0c;它们都能够产生输入事件&#xff0c;产生输入数据给计算机系统…

文件夹加密软件哪个好用?文件加密的4个必备方法(2024)

如果您的电脑上有重要的个人或商业内容&#xff08;例如知识产权&#xff09;&#xff0c;您可能想知道如何确保数据的安全。如果笔记本电脑丢失或被盗&#xff0c;他人可能会访问硬盘驱动器的内容&#xff0c;从而获取到您的个人隐私信息。因此&#xff0c;通过文件夹加密软件…

水电站生产指挥调度系统方案

一、方案背景 在碧波荡漾的大江大河之上&#xff0c;巍然屹立着一座座水电站&#xff0c;它们如同一个个巨人在默默地守护着我们的家园。在这些建设者的辛勤耕耘下&#xff0c;水电站在保障国家能源安全、优化能源结构以及减少环境污染等方面发挥着重要作用。 然而&#xff0c…

vue开发网站-使用插件element、vant 遇到的问题

1. js把两个字符串放进一个另字符串里&#xff0c;用逗号分隔 let string1 "Hello"; let string2 "World"; let result ${string1},${string2}; console.log(result); // 输出: Hello,World2.js将字符串转为数组 const str "Hello, world!"…

深入探索 Linux 命令之 AWK:文本处理的神兵利器

深入探索 Linux 命令之 AWK&#xff1a;文本处理的神兵利器 在 Linux 系统中&#xff0c;文本处理是日常运维和数据分析中不可或缺的一部分。而 awk 命令&#xff0c;作为 Linux 文本处理三剑客之一&#xff08;另外两个是 sed 和 grep&#xff09;&#xff0c;以其强大的文本…

跨越百亿营收的今世缘,全国化进程仍挑战重重?

当前&#xff0c;白酒市场正在经历一场深度调整&#xff0c;随着存量时代到来&#xff0c;白酒品牌地位的更替和竞争格局的重构已经展开。这一背景下&#xff0c;今世缘等地方性酒企也正在凭借对区域市场的深耕&#xff0c;展现出较快的成长速度&#xff0c;并希望能借此占领市…

搭建一个基于主流技术Spring Boot 2 + Vue 3 + Ant Design Vue的技术框架的简要步骤

搭建一个基于主流技术Spring Boot 2 Vue 3 Ant Design Vue的技术框架涉及前后端分离的开发模式。以下是一个简化的步骤指南&#xff0c;用于帮助你开始这个项目&#xff1a; 1. 后端&#xff08;Spring Boot 2&#xff09; 1.1 初始化项目 使用Spring Initializr&#xff08;…

超强算力 Orange Pi Kunpeng Pro 开发板基础测评与体验

目录 开箱体验资源简介系统启动连接网络登录系统通过桌面登录通过串口登录通过 SSH 登录配置散热风扇 算力测试MNIST示例MBNET示例 体验总结 大家好&#xff0c;我是 Hello 阿尔法&#xff0c;有幸接到 CSDN 的邀请参与 Orange Pi Kunpeng Pro 开发板的测评活动&#xff0c;本文…

【Redis】redis高阶-使用zset实现延时队列

Hi,大家好&#xff0c;我是抢老婆酸奶的小肥仔。 最近在使用redis时&#xff0c;就想能不能用其实现消息队列&#xff1f;也在网上看了下其他小伙伴写的实现&#xff0c;结合自身业务实现了如下消息队列&#xff0c;希望对大家有用。 废话不多说&#xff0c;直接开撸。 1、为…