#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

相关文章

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

CentOS 7 YUM源配置错误的解决方法

《CentOS7YUM源配置错误的解决方法》在使用虚拟机安装CentOS7系统时,我们可能会遇到YUM源配置错误的问题,导致无法正常下载软件包,为了解决这个问题,我们可以替换YUM源... 目录一、备份原有的 YUM 源配置文件二、选择并配置新的 YUM 源三、清理旧的缓存并重建新的缓存四、验证 YUM 源

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获