进程通信(同一主机)

news2024/11/26 16:56:26

1.概述

进程通信机制包括:

传统的UNIX进程间通信:无名管道、有名管道、信号

System V 进程间通信:消息队列、信号量、共享内存

2.管道通信

在这里插入图片描述

2.1无名管道

1.特点

(1)适用具有亲缘关系的进程

(2)是特殊的文件,read(),write()

(3)但不在文件系统中,存在内核中

(4)半双工在这里插入图片描述

2.无名管道的创建与关闭

创建:

int pipe_pid[2];
if ( pipe(pipe_fd) < 0 ){
	perror("fail to pipe");
	exit(-1);
}

关闭:

close(pipe_fd[0])

3.注意点

(1)管道读端存在时,写入数据才有意义,否则Broken Pipe。
(2)不保证写入的原子性。
(3)父子进程先后次序不保证。

4.代码示例

首先创建管道,而后父进程用fork()创建子进程,最后关闭父进程的写端,关闭子进程的读端,建立管道通信。

#include <stdio.h>
#include <unistd,h>

int main ( void ){
	int pipe_fd[2];
	if ( pipe(pipe_fd) < 0 )//创建管道
	{
		perror("piep errpr");
		exit(-1);
	}

	//创建子进程
	pid_t pid = fork();
	
	//判错
	if ( pid < 0 ){
		perror("fork error");
		exit(-1);
	}
	//子进程发送信息
	else if (0 == pid){
		//1.关闭读端
		close(pipe_fd[0])//2.写入数据
		char buf[20] = {0};
		printf("子进程发送数据:");
		fgets( buf, sizeof(buf), stdin);
		//写入管道
		write( pipe_fd[1], buf, strlen(buf) );
		//3.关闭写端
		close( pipe_fd[1] );
	}
	//父进程接受消息
	else if( pid > 0 ){
		//1.关闭写端
		close ( pipe_fd[1] );
		//2.读取数据
		buf[20] = {0};
		printf("父进程接收数据:");
		read ( pipe_fd[0], buf, strlen(buf) );
		//3.关闭读端
		close ( pipe_fd[0] );

		//收集子进程退出信息
		waitpid ( pid, NULL, 0 );
		exit(0);
	}
}

2.2有名管道

1.特点

(1)适用于互不相关的进程

(2)是文件系统中的文件open write read close,先进先出FIFO

(3)不支持lseek()函数

`lseek()` 是一个系统调用函数。
功能:改变文件读写位置、移动文件指针到文件的任意位置、
     以及判断文件指针的位置等。
参数:文件描述符、移动的偏移量和移动的起始位置。
返回值:移动后的文件指针位置,出错 -1

2.创建有名管道

#include <fcntl.h>
#include <sys/types.h>

//mkfifo( 文件名, 文件权限 );成功0,失败-1.
if ( mkfifo(newfifo, 0664) < 0 ){
	perror("fail to mkfifo");
	exit(-1);
}

3.有名管道FIFO出错信息

EACCESS:指定路径无可执行权限
EEXIST:指定文件已存在
ENAMETOOLONG:路径名称太长
ENOENT:文件不存在
ENOSPC:空间不足
ENOTDIR:目录存在却非真正的目录
EROFS:指定文件存在于只读文件系统内

4.代码示例

写管道程序:

//fifo_write.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>

#define MYFIFO "myfifo"

int main( int argc, char* argv[])
{
	int fd;
	int nwrite;
	
	if (argc < 2){
		printf("运行时输入字符串\n");
		exit(-1);
	}

	//以只写方式打开有名管道
	fd = open(MYFIFO, O_WRONLY)
	if(fd < 0)
	{
		perror("fail to open fifo");
		exit(-1);
	}
	//向管道中写入字符串
	nwrite = write(fd, argv[1], strlen(argv[1]+1) );
	if ( nwrite > 0 ){
		printf("向FIFO中写入%s\n", argv[1]);
	}
	close(fd);

	return 0;
}

读管道程序:

//fifo_read.c
//头文件同上
int main()
{
	char[256];
	int fd;

	//判断FIFO是否存在
	if(access(MYFIFO, F_OK) == -1){  //FIFO不存在
		if(mkfifo(MYFIFO, 0664) < 0){
			perror("fail to open fifo");
			exit(-1);
		}
	}
	
	//以只读方式打开有名管道
	fd = open(MYFIFO, O_RDONLY)
	if(fd < 0 ){
		perror("fail to open file");
		exit(-1);
	}

	while(1){
		memset(buf, 0, sizeof(buf) );		
		nread = read(fd, buf, 256);
		if(nread > 0){
			printf("从管道中读取的内容为:%s\n", buf);
		}
	}
		close(fd);
		
		return 0;
	}

首先运行读管道程序,若管道中无数据,就一直阻塞到写入数据

3.信号通信

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

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

相关文章

C++高精度减法

高精度减法指的是大整数的相减&#xff0c;大整数是用基本数据类型无法存储其精度的整数&#xff0c;位数不超过10^6&#xff0c;注意是位数&#xff0c;不是数值的大小。 因为其精度超过基本的数据类型规定的大小&#xff0c;所以常规的计算方法是不可以实现的&#xff0c;这…

UE4 架构初识(二)

目录 UE4 引擎学习 一、架构基础 1. Pawn &#xff08;1&#xff09;DefaultPawn &#xff08;2&#xff09;SpectatorPawn &#xff08;3&#xff09;Character 2. AController 3. APlayerState 4. 总结 UE4 引擎学习 一、架构基础 1. Pawn UE也是从Actor中再派生…

Zynq-7000、国产zynq-7000的GPIO控制(二)

本文详细说明一下使用SDK中使用MIO/EMIO作为输入中断 SDK中使用MIO/EMIO作为输入中断 这个使用场景可以扩展到PL的可以通过EMIO或者MIO&#xff0c;告知PS中断来了&#xff0c;需要PS处理一些特定事物&#xff0c;当然也可以连接最简单的按键。 这个可以参考SDK自带例程来实…

Python入门教程+项目实战-11.2节: 元组的操作符

目录 11.2.1 元组的常用操作符 11.2.2 []操作符: 索引访问元组 11.2.3 [:]操作符&#xff1a;元组的切片 11.2.4 操作符&#xff1a;元组的加法 11.2.5 *操作符&#xff1a;元组的乘法 11.2.6 元组的关系运算 11.2.7 in操作符&#xff1a;查找元素 11.2.8 知识要点 11…

企业的信息化和数字化有什么区别

数字化是业务新的存在形式&#xff0c;如果说信息化是对业务的局部支撑&#xff0c;那么数字化就是对业务的整体重塑&#xff0c;这是数字化和信息化之间最大的区别&#xff0c;也决定了数字化转型在实施时有着与信息化建设完全不同的底层逻辑。信息化建设和数字化转型有着相同…

手把手教你编写SQLMap的Tamper脚本过狗

本文仅用于技术讨论与学习 测试环境 最新版某狗 测试方法 安全狗其实是比较好绕的WAF&#xff0c;绕过方法很多&#xff0c;但这里我们就用一种&#xff1a;注释混淆 一招鲜吃遍天 注释混淆&#xff0c;其实就是在敏感位置添加垃圾字符注释&#xff0c;常用的垃圾字符有/、…

关于Vue中使用全屏容器无法占满屏幕以及样式不生效问题解决方案

先来看示例问题 App.vue文件 global.css文件 网页效果 可以看到即使设置了宽度和高度为100%都无法占满屏幕&#xff0c;而且容器还超出了屏幕&#xff0c;上拉才可以看到下边框。查看网上解决方法&#xff1a; 1.height设置为100vh&#xff0c; 或者设置为calc&#xff08;10…

订单交期迟滞,销售回应慢,怎么解决客户问题?

按客户定制产品订单&#xff0c;进行报价和生产的制造企业&#xff0c;有拆解图纸生成物料BOM的工序&#xff0c;通常由企业产品设计部门的拆图员岗位专门负责。 手工制作BOM数据&#xff0c;准确性低 拆图员肉眼查看每页图纸中的表格数据&#xff0c;手动敲键盘填入到企业要…

判空、基本数据类型、stream的groupby、空指针异常

0什么是序列化 1 第一行、第二行就是一个空对象【一个对象的所有元素的值都为null–空对象】 第三行不是空对象&#xff0c;是元素为的对象 那么如何过滤第一行与第二行呢 方式一&#xff1a;在mysql里面 where ISNULL(t.relevance_id)0 and LENGTH(trim(t.relevance_id))&…

Docker Harbor | 私有仓库 | 用户登录 |用户创建

Docker Harbor | 私有仓库 |用户登录 |用户创建 一、Docker Harbor 概述二、Harbor 的核心组件四、Harbor 构建 Docker 私有仓库实战4.1 搭建本地私有仓库4.2 部署 Docker-Compose 服务4.3 启动harbor验证4.4 在其他客户端上传镜像4.5 维护管理Harbor 一、Docker Harbor 概述 …

【校招VIP】面试了一个抽奖的项目,我终于搞明白了,是8股文终于开始作恶了

最近因为招实习生&#xff0c;进行了很多次面试。 但面试的结果不尽人意。 就感觉今年的面试跟以前差距太大了。 直到经过这个同学的面试&#xff0c;我终于明白了是什么原因。 这个同学是南京一所211的研究生&#xff0c;他的项目经历是做了一个抽奖的微服务管理平台。 也…

JAVA 类型的类型转换

JAVA 类型的类型转换 一、基本类型的类型转换 箭头开始的地方是小类型,箭头指向的地方是大类型 我们此处所指的"大"和"小",指的是对应类型的取值范围,不是字节数哦 1.1 小到大(隐式转换) byte m 120; int n m;//小转大,右面的m是小类型,给左面的n大…

【微服务笔记21】微服务组件之Sentinel服务熔断、服务降级、流量控制介绍

这篇文章&#xff0c;主要介绍微服务组件之Sentinel服务熔断、服务降级、流量控制。 目录 一、Sentinel组件 1.1、Sentinel介绍 1.2、Sentinel环境搭建 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;资源和规则 1.3、使用SphU定义资源 &#xff08;1&am…

LNMP网站框架搭建

1. Nginx的工作原理 php-fpm.conf 是控制php-fpm守护进程的 php.ini是php解析器 工作进程&#xff1a; 1.客户端通过域名进行请求访问时&#xff0c;会找Nginx对应的虚拟主机 2. Nginx对该请求进行判断&#xff0c;如果是静态请求,Nginx会自行处理&#xff0c;并将处理结果返…

微信小程序原生开发功能合集十三:列表界面的实现

本章实现列表展示组件,包括列表数据加载、筛选、分页加载、快速搜索等功能。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: https://edu.csdn.net/course/detail/379…

提交代码「前置处理」,向前一小步,效率提升「亿点点」

&#x1f4a1; 如何巧用 Git Hook&#xff0c;解决代码提交中的代码规范性、冲突和错误以及工作流程问题&#xff1f; 近日&#xff0c;在极狐Tech Talk 直播上&#xff0c;极狐(GitLab) 后端工程师田鲁分享了自己的实践经验。以下内容整理自本次直播&#xff0c;你也可以点击文…

Linux第二章

文章目录 前言一、Linux系统的目录结构和路径表达形式二、Linux命令基础1.ls命令入门2.ls命令的参数和选项3.-cd-pwd命令4.相对路径绝对路径和特殊路径符5.-mkdir命令6.-touch-cat-more-命令7.-cp-mv-rm-命令8.-which-find命令9.-grep-wc-管道符10.-echo-tail-重定向符11.-vi编…

Spring Boot自动装配

目录 是什么&#xff1f; 自动装配的原理 进入SpringBootApplication注解 点击进入EnableAutoConfiguration注解 AutoConfigurationImportSelector&#xff08;核心&#xff09; 点进getAutoConfigurationEntry()方法: 点进getCandidateConfigurations() 流程图 是什么&…

远程支持软件:轻松解决电脑问题!

远程协助不工作 当我们提到Windows的远程支持软件时&#xff0c;许多人的第一个想法可能是Windows远程协助。它可以通过发送和接收邀请文件连接两台电脑&#xff0c;然后您可以远程修复另一台电脑上的问题。但是&#xff0c;有时&#xff0c;您会遇到诸如“远程协助无法连接…

【FFTW库】编译生成 x86、arm 环境下的FFTW库

FFTW是一个快速计算离散傅里叶变换的标准C语言程序集&#xff0c;可计算一维或多维实和复数据以及任意规模的DFT。下面主要介绍的是 x86 环境下 FFTW库的编译过程&#xff0c;arm环境下的编译过程和FFTW类似&#xff0c;不同之处在于需要手动指定 编译环境 和 编译器。 FFTW有…