利用命名管道实现任意进程间的通信

简介: 利用命名管道实现任意进程间的通信

我们知道每个进程都有自己的虚拟地址空间,其中包括了用户空间和内核空间,用户空间是进程可以访问的地址空间,内核空间就是操作系统内核独享的部分,所以任意进程共享内核空间。

此时,我们就可以借助内核开辟一块内存用于进程间的通信。

创建文件是mkdir filename  创建命名管道也是类似的 mkfifo filename

当然也可以用一个函数

#include <sys/types.h>
#include <sys/stat.h>
 
int mkfifo(const char *pathname, mode_t mode);
  • pathname:命名管道的路径名。
  • mode:指定创建的管道的访问权限,类似于 chmod 函数中的权限设置。
返回值:
  • 若成功,返回0。
  • 若失败,返回-1,并设置 errno 错误码以指示错误类型
实操部分

一个fifo_w.c   用于写端

一个fifo_r.c     用于读端

几个问题  1.一个读一个写肯定没问题,一个写多个读呢?

                2.一个读多个写呢?多个读多个写呢?

先给出实验结果,代码放下面

如下图,一个读,两个写,其实他读的顺序是不能保证两个线程写入的时机冲突问题

一个写,多个读

mmap实现方式:内存映射实现进程通信-CSDN博客

fifo_w.c

#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void sys_err(char *str){
        perror(str);
        exit( -1);
}
int main(int argc,char *argv[]){
        int fd,i;
        char buf[ 4096];
        if (argc < 2) {
        printf( "Enter like this: ./a.out fifonane\n");
        return -1;
        }
        fd = open(argv[1],O_WRONLY);
        if(fd< 0)
                sys_err( "open" );
        i=0;
        while(1){
        sprintf(buf,"hello pku %d\n",i++);
        write(fd,buf,strlen(buf));
        sleep(1);
        }
        close(fd);
        return 0;
}

fifo_r.c:

#include <sys/stat.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
void sys_err(char *str){
        perror(str);
        exit( -1);
}
int main(int argc,char *argv[]){
        int fd,len;
        char buf[4096];
        if (argc < 2) {
        printf( "./a.out fifonane\n");
        return -1;
        }
        fd = open(argv[1],O_RDONLY);
        if(fd< 0)
                sys_err( "open" );
        while(1){
                len=read(fd,buf,sizeof(buf));
                write(STDOUT_FILENO,buf,len);
                sleep(1);
        }
        close(fd);
        return 0;
}
相关文章
|
1月前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
162 4
|
1月前
|
消息中间件 Unix Linux
C语言 多进程编程(二)管道
本文详细介绍了Linux下的进程间通信(IPC),重点讨论了管道通信机制。首先,文章概述了进程间通信的基本概念及重要性,并列举了几种常见的IPC方式。接着深入探讨了管道通信,包括无名管道(匿名管道)和有名管道(命名管道)。无名管道主要用于父子进程间的单向通信,有名管道则可用于任意进程间的通信。文中提供了丰富的示例代码,展示了如何使用`pipe()`和`mkfifo()`函数创建管道,并通过实例演示了如何利用管道进行进程间的消息传递。此外,还分析了管道的特点、优缺点以及如何通过`errno`判断管道是否存在,帮助读者更好地理解和应用管道通信技术。
|
17天前
|
SQL 网络协议 数据库连接
已解决:连接SqlServer出现 provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程【C#连接SqlServer踩坑记录】
本文介绍了解决连接SqlServer时出现“provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程”错误的步骤,包括更改服务器验证模式、修改sa用户设置、启用TCP/IP协议,以及检查数据库连接语句中的实例名是否正确。此外,还解释了实例名mssqlserver和sqlserver之间的区别,包括它们在默认设置、功能和用途上的差异。
|
2月前
|
消息中间件 Linux 开发者
Linux进程间通信秘籍:管道、消息队列、信号量,一文让你彻底解锁!
【8月更文挑战第25天】本文概述了Linux系统中常用的五种进程间通信(IPC)模式:管道、消息队列、信号量、共享内存与套接字。通过示例代码展示了每种模式的应用场景。了解这些IPC机制及其特点有助于开发者根据具体需求选择合适的通信方式,促进多进程间的高效协作。
103 3
|
2月前
|
Linux
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
2月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
59 0
|
2月前
|
消息中间件 存储 安全
python多进程并发编程之互斥锁与进程间的通信
python多进程并发编程之互斥锁与进程间的通信
|
2月前
|
Linux C语言
【C语言】进程间通信之命名管道fifo
【C语言】进程间通信之命名管道fifo
14 0
|
2月前
|
C语言
【C语言】进程间通信之管道pipe
【C语言】进程间通信之管道pipe
32 0
|
3月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能

相关实验场景

更多