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

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

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

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

创建文件是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;
}
相关文章
|
7天前
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
7天前
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
29天前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
15 0
|
2月前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
290 4
|
2月前
|
消息中间件 Unix Linux
C语言 多进程编程(二)管道
本文详细介绍了Linux下的进程间通信(IPC),重点讨论了管道通信机制。首先,文章概述了进程间通信的基本概念及重要性,并列举了几种常见的IPC方式。接着深入探讨了管道通信,包括无名管道(匿名管道)和有名管道(命名管道)。无名管道主要用于父子进程间的单向通信,有名管道则可用于任意进程间的通信。文中提供了丰富的示例代码,展示了如何使用`pipe()`和`mkfifo()`函数创建管道,并通过实例演示了如何利用管道进行进程间的消息传递。此外,还分析了管道的特点、优缺点以及如何通过`errno`判断管道是否存在,帮助读者更好地理解和应用管道通信技术。
|
2月前
|
SQL 网络协议 数据库连接
已解决:连接SqlServer出现 provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程【C#连接SqlServer踩坑记录】
本文介绍了解决连接SqlServer时出现“provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程”错误的步骤,包括更改服务器验证模式、修改sa用户设置、启用TCP/IP协议,以及检查数据库连接语句中的实例名是否正确。此外,还解释了实例名mssqlserver和sqlserver之间的区别,包括它们在默认设置、功能和用途上的差异。
|
3月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
66 0
|
4月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
4月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
156 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
3月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。

相关实验场景

更多
下一篇
无影云桌面