进程通信(同一主机)

news/2024/11/19 17:34:16/

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.ppmy.cn/news/50990.html

相关文章

微信小程序php+vue 校园租房指南房屋租赁系统

本着诚信的原则&#xff0c;平台必须要掌握出租方必要的真实可信的信息&#xff0c;这样就可以防止欺诈事件的发生&#xff0c;事后也可以联系找到出租方。并且租金等各方面规范标准化&#xff0c;在这易租房诚信可信的平台让承租方与出租方充分有效对接&#xff0c;既方便了承…

JavaScript字符串操作

ASCII&#xff08;as key&#xff09; 字符集&#xff08;了解&#xff09; 我们都知道&#xff0c;计算机只能存储 0101010 这样的二进制数字&#xff0c;那么我们的 a ~ z / A ~ Z / $ / /… 之类的内容也有由二进制数字组成的 我们可以简单的理解为&#xff0c; a ~ z / …

Linux服务器出现503 服务不可用错误怎么办?

​  HTTP 503 服务不可用错误代码表示网站暂时不可用。无论您是网站访问者还是管理员&#xff0c;503 页面都很麻烦。尽管该错误表明存在服务器端问题&#xff0c;但对于访问者和网络管理员来说&#xff0c;有一些可能的解决方案。本文将解释Linux服务器出现503 服务不可用错…

微服务下网关聚合Swagger文档、starter统一配置Swagger

一、starter实现统一配置微服务文档 把Swagger配置中的公共部分抽取出来Swagger与SpringBoot整合中&#xff0c;可能会由于版本问题出现各种问题 1、制作starter 参考&#xff1a; 【SpringBoot】自定义启动器 Starter【保姆级教程】用starter实现Oauth2中资源服务的统一配置用…

GenericJackson2JsonRedisSerializer

GenericJackson2JsonRedisSerializer 对于这个不存在的属性, 需要标注为忽略, 否则, 反序列化时, 会报错。 主要也是因为&#xff0c;我们拿不到GenericJackson2JsonRedisSerializer中的mapper&#xff0c;不然&#xff0c;是可以修改mapper的反序列化特性的&#xff0c;把map…

最小生成树|二分图

最小生成树跟边的正负没有任何关系。 最小生成树 朴素Prime 该算法和Dijkstr算法很像。 先把所有距离初始化为正无穷 进行n次迭代 找到不在集合&#xff08;集合指当前的生成树&#xff09;当中的点&#xff0c;s数组表示当前已经在连通块&#xff08;生成树&#xff09;中的所…

同步辐射X射线断层扫描成像在各行业的应用

同步辐射X射线断层扫描成像在各行业的应用 同步辐射X射线断层扫描成像&#xff08;synchrotron radiation X-ray computed tomography&#xff0c;SRCT&#xff09;是一种非侵入式、高分辨率的成像技术&#xff0c;利用同步辐射光束产生的高强度、高亮度、单色性和相干性的X射线…

网络基础-IP和端口号以及认识传输层协议

概念回顾 MAC地址仅需要在同一个局域网下唯一&#xff0c;就可以保证不会出现通讯问题。 通信的目的是两台机器上的应用软件要通信。即客户端进程和服务端进程要获取这个数据&#xff0c;借助主机来完成通信。故将数据在主机间转发仅仅是手段&#xff0c;机器收到后&#xff…