#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#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

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

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

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

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