Linux系统进程与进程间通信

      Linux是一个多用户、多任务的操作系统,支持多个进程同时运行。进程是Linux系统中的基本单元,它们负责执行各种任务,如网页浏览、文件下载、程序运行等。在Linux中,进程是由一个或多个线程组成的,线程是进程的基本执行单元。   

一.进程基础

        进程指正在运行的程序,如下图示,是资源分配的最小单位,可以通过“ps ”或“ top ”等命令查看正 在运行的进程,线程是系统的最小调度单位,一个进程可以拥有多个线程,同一进程里的线程可以共享此 进程的同一资源。

 

每个进程都有一个唯一的标识符,既进程 ID ,简称 pid 进程间的通信的几种方法?
1. 管道通信:有名管道,无名管道
        2 .信号通信:信号的发送,信号的接受,信号的处理
        3 .IPC 通信:共享内存,消息队列,信号灯
        4 .Socket 通信
进程的三种基本状态以及转换 :

 

 

二.进程创建 

        所有的进程都是由其他进程创建(除了 pid 0 号的 idle 进程), pid 号为 1 init 进程是系统启动后 运行的第一个进程,是所有进程的父进程,init 进程会初始化一部分系统服务,创建其他进程。
        创建新进程的那个进程称为父进程,新进程称为子进程,父进程和子进程拥有相同的代码段数据段,有各自独立的地址空间。采用写时拷贝技术,即创建的新进程不会立即把父进程的资源空间复制过来,只有在修改时才会复制资源,另外父进程挂起的信号和文件锁不会被子进程继承。子进程结束后,它的父进程要回收它的资源,否则就会成为僵尸进程 。如果父进程先结束,子进程会被 init 进程收养,称为孤儿进程。

 

 (1)fork()函数

        用于创建一个与父进程完全相同的子进程。子进程是父进程的副本,拥有自己的地址空间、文件描述符和资源,但共享父进程的部分信息,如打开的文件描述符、环境变量等。fork()函数的原型是pid_t fork(void);,它返回两次,一次在父进程中返回子进程的PID,一次在子进程中返回0。

 (2)父进程中创建一个子进程

         1.代码

#include <stdio.h>
#include <unistd.h>
int main(void)
{pid_t pid;pid = fork();if (pid < 0){printf("fork is error \n");return -1;}//父进程if (pid > 0){printf("This is parent,parent pid is %d\n", getpid());}//子进程if (pid == 0){printf("This is child,child pid is %d,parent pid is %d\n", getpid(), getppid());}return 0;
}

        2.结果打印

 

三.exec()函数

        在当前进程中执行一个新的程序。它会替换当前进程的代码和数据段,但保留原有的堆和栈。exec()函数的原型是int exec(const char *path, char *const argv[]);,它用于执行一个新的程序。参数path指定要执行的程序路径,参数argv是一个指向字符指针数组的指针,用于传递给新程序的参数。

(1)代码

#include <stdio.h>  
#include <unistd.h>  int main() {  char *argv[] = {"ls", "-l", NULL};  exec("ls", argv);  return 0;  
}

  exec()函数执行了ls命令,并传递了一个参数-l

四.ps kill 命令       

        ps 命令 ps 命令可以列出系统中当前运行的那些进程。
                        命令格式:ps [参数]
                        命令功能:用来显示当前进程的状态
                        常用参数: aux
        kill 命令 kill 命令用来杀死进程
                        举例:kill -9(SIGKILL) PID
        进程的状态
                        D: 无法中断的休眠状态 (通常 IO 的进程 )
                        R: 正在执行中
                        S: 静止状态
                        T: 暂停执行
                        Z: 不存在但暂时无法消除
                        W: 没有足够的记忆体分页可分配
                        <: 高优先序的行程
                        N: 低优先序的行程
                        L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱 A I/O)
                        如下所示,使用命令“ ps aux | grep a.out ”查找到 ./a.out 的进程号为 3179 ,然后输入“ kill -9 3179 ”结 束此进程,

        完成后再次输入查找命令“ps aux | grep a.out”,没有发现 3179 号进程。 

 

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

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

相关文章

QT day3作业

1.思维导图 2、 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密…

k8s-集群升级 2

在每个集群节点都安装部署cir-docker 配置cri-docker 升级master节点 导入镜像到本地并将其上传到仓库 修改节点套接字 升级kubelet 注&#xff1a;先腾空后进行升级&#xff0c;顺序不能搞反&#xff0c;否则会导致严重问题 配置kubelet使用cri-docker 解除节点保护 升级wor…

Module build failed (from ./node_modules/postcss-loader/src/index.js):

出现该错误是你可能没认真看官网的安装配置&#xff0c;可直接看该目录3&#xff0c;一个字一个字看 先安装uview 如果选择v1版本&#xff0c;建议使用npm下载&#xff0c;下面以v1版本为例&#xff0c;使用的是npm下载&#xff0c;导入uview时该文件也在node_modules文件夹里…

92 [递归实现指数型枚举](https://www.acwing.com/problem/content/94/)

从 1∼n1∼&#xfffd; 这 n&#xfffd; 个整数中随机选取任意多个&#xff0c;输出所有可能的选择方案。 输入格式 输入一个整数 n&#xfffd;。 输出格式 每行输出一种方案。 同一行内的数必须升序排列&#xff0c;相邻两个数用恰好 11 个空格隔开。 对于没有选任何…

Linux控制---进程程序替换

前言&#xff1a;前面我们学洗了Linux进程退出的相关知识&#xff0c;了解了什么是进程退出&#xff0c;已经进程等待的相关话题&#xff0c;今天&#xff0c;我们来学习Linux中的进程程序替换&#xff0c;进程程序替换在Linux中可以用于实现新程序的启动、程序升级、多进程程序…

【JUC】七、读写锁

文章目录 1、读写锁2、读写锁的体验3、读写锁的特点4、锁的演变5、读写锁的降级6、复习&#xff1a;悲观锁和乐观锁 1、读写锁 JUC下的锁包的ReadWriteLock接口&#xff0c;以及其实现类ReentrantReadWriteLock ReadWriteLock 维护了一对相关的锁&#xff0c;即读锁和写锁&…

网站分类seo怎么优化(如何调整有利于SEO排名)

网站分类seo怎么优化&#xff08;如何调整有利于SEO排名&#xff09; 这期分享一篇关于网站seo优化中关于网页分类排名优化的文章&#xff0c;看看原文来自 蝙蝠侠IT &#xff0c;原文标题网站分类&#xff0c;没有SEO标题&#xff0c;怎么办的文章介绍。 理想与现实总是充满矛…

计算属性与watch的区别,fetch与axios在vue中的异步请求,单文本组件使用,使用vite创建vue项目,组件的使用方法

7.计算属性 7-1计算属性-有缓存 模板中的表达式虽然很方便,但是只能做简单的逻辑操作,如果在模版中写太多的js逻辑,会使得模板过于臃肿,不利于维护,因此我们推荐使用计算属性来解决复杂的逻辑 <!DOCTYPE html> <html lang"en"> <head><meta …

msvcp140.dll文件的丢失原因以及五个解决办法

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复丢失的msvcp140.dll文件。本文将介绍五个处理办法&#xff0…

正点原子阿尔法Linux开发板——MfgTool烧写工具烧写系统

WINDOWS系统下 前提准备 OTG、TTL的USB接口分别连接电脑 USB_OTG 用于烧写&#xff0c;USB_TTL 用于串口查看烧录进度 拨码拨至USB烧录——0100 0000 烧写 SECURE 软件连接串口CH340的COM&#xff08;软件安装激活&#xff09; 我的开发板是I.MX6ULL(EMMC)——双击"Li…

mysql操作 sql语句中的完整性约束有哪些,主键约束、外键约束、引用完整性约束,主键外键、唯一性

什么是约束&#xff1a;约束&#xff1a;就是约定哪些东西能填、怎么填&#xff1f;哪些东西不能填&#xff1f; 文章目录 前言&#xff1a;建表正文一、实体完整性约束1. 主键约束2. 唯一性约束3. 自增长约束4. 联合主键约束 二、域完整性约束三、引用完整性约束1. 外键约束 讲…

JVM虚拟机-虚拟机性能监控、故障处理工具

1基础故障处理工具 jps&#xff08;JVM Process Status Tool&#xff09;是&#xff1a;虚拟机进程状况工具 作用&#xff1a;可以列出正在运行的虚拟机进程&#xff0c;并显示虚拟机执行主类&#xff08;Main Class&#xff0c;main()函数所在的类&#xff09;名称以及这些进…