#CentOS on Mac#3.进程通信

2024-01-17 07:18

本文主要是介绍#CentOS on Mac#3.进程通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

要求写两个进程A跟B
A:无限循环输出一个字符
B:入侵进程A,改变输出的字符

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{pid_t pid;  //进程号char *message;int n;printf("Process starting\n");pid = fork();switch(pid){case -1:perror("failed");exit(1);case 0:message = "Process A";n = 10; //循环10次break;default:message = "Process B"; //父进程n = 4;break;}while(1) {puts(message);sleep(1); //1s}exit(0);
}

gcc -o process process.c
./process

ctrl+c 退出死循环

这里写图片描述

1.进程B可以破坏隔离性,修改进程A输出的原因

调用fork可以创建一个全新的进程。
这个系统调用对当前进程进行复制。在进程表里创建一个新的项目,许多属性与当前进程是相同的。新进程和原进程几乎一模一样,执行的也是相同的代码,但新进程有自己的数据空间、自己的环境等。

程序调用了fork函数的时候被分成了两个进程。在父进程里,fork函数返回新进程的PID进程号,新进程则返回0,这个可以做为区分父子进程的依据。

2.进程通信的作用

(1)数据传输:一个进程需要将它的数据发送给另一个进程
(2)共享数据:一个进程对共享数据的修改,别的进程应该立刻看到。
(3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
(4)资源共享:多个进程之间共享同样的资源,需要内核提供锁和同步机制。
(5)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

3.隔离性与通信的平衡

操作系统中,进程间是相互不可见的。操作系统在逻辑上将每个进程隔离开了。一个进程里是不可能看到真实的物理内存地址的。内存地址,都是虚拟内存地址,而不是真实的物理内存地址。每个进程的虚拟内存地址都是一样大的

进程间的内存相互隔绝,防止进程间的相互干扰。
假如A进程在操作一个内存时,B进程无意中程序执行出错,改写了A的进程的内存,A进程就很可能崩溃,从而造成了破坏。这也是保护各个进程的安全的一个手段。同时,操作系统也是有各种进程组成的。
系统的进程同样也会被其他进程进行破坏,既保护了用户程序安全,更是保护了操作系统本身,使操作系统变得很健壮。因为程序的操作都是在自己的虚拟地址空间中执行的,系统内部在执行时,总是可以将虚拟内存地址映射到进程的实际的内存地址区间而不会越界,从而避免了内存破坏问题。

(1) 将进程相互隔绝,才会出现各种各样的通信机制。
比如内存映射文件,将一个文件打开,作为通信中介,然后将这文件作为内核对象,分配一个句柄,这个是公用的文件,而这个句柄,是系统全部进程都可以看到的,并且看到的都是同一个,然后通过向系统请求,得到访问这个内核对象的句柄就可以操作了。操作完后,其他进程才可以操作,这个是“进程间的互斥”。而通过这种方式就可以更改公共的变量,达到通信的目的。而这个通信的过程就是内存映射文件模式。内核文件作为一个中介,让相互看不见的进程可以相互交换数据。

(2) 管道,邮槽则也是通过消息信件机制,通过系统投递给进程的。
进程只要接受这个信件即可,然后了解情况后再发送信件。系统成为了信使。这样也达到通信的机制。

这些也就解决了进程间相互不能通信的问题,也保证进程间相互隔绝后的安全。

这篇关于#CentOS on Mac#3.进程通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/615252

相关文章

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一