命名管道 C++

C++的创建命名管道(CreateNamedPipe) 一、命名管道(Named Pipes) 管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。 匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。 命名管道,顾名思义,这个管道肯定是有名字的。通过管道的名字来确保多个进程访问同一个管道。事实上,命名管道不仅可在同一台计算机的不同进程 阅读详情

C++实现
fifo_read.c

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define FIFO "/tmp/myfifo1"

int main(int argc,char* argv[])
{
    char buf_r[100];
    int fd;
    int nread;

    if(access(FIFO,F_OK) == -1) {
        if(mkfifo(FIFO,0777) == -1 && (errno != EEXIST)) //O_CREAT|O_EXCL|
        {
            printf("cannot create fifoserver\n");
        }
    }
    
    printf("preparing for reading byte... \n");

    fd = open(FIFO,O_RDONLY|O_NONBLOCK,0);//|O_NONBLOCK
    if(fd ==-1)
    {
        perror("open");
        exit(1);
    }

    while(1)
    {
        memset(buf_r,0,sizeof(buf_r));
        if((nread = read(fd,buf_r,100)) == -1){
            if(errno == EAGAIN)
                printf("no data yet\n");
        }
        printf("read %s from FIFO\n",buf_r);
        sleep(1);
    }
    pause();
    unlink(FIFO);
    return 0;
}

fifo_write.c

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define FIFO_SERVER "/tmp/myfifo2"

typedef struct STRUWriteFifo
{
    unsigned int iCol;
    unsigned int iRow;
}struFifo;
int main(int argc,char* argv[])
{
    char buf_w[25] = {0};
    int fd;
    int nwrite;

    fd = open(FIFO_SERVER,O_WRONLY|O_NONBLOCK);

    if(argc == 1)
        printf("Please send something \n");
    strcpy(buf_w,argv[1]);

    struFifo struWriteFifo;
    struWriteFifo.iCol = 2;
    struWriteFifo.iRow = 3;

    nwrite = write(fd,(char*)&struWriteFifo,sizeof(struWriteFifo));
    // nwrite = write(fd, buf_w,sizeof(buf_w));
    if(nwrite == -1)
    {
        if(errno == EAGAIN)
            printf("The FIFO has not been read yet.Please try later\n");
    }
    else
    {
        printf("write %s to the FIFO\n",buf_w);
    }

    close(fd);
    return 0;
}

fifo_select.c

#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/select.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>

#define FIFO_I  "/tmp/myfifo1"
#define FIFO_II "/tmp/myfifo2"

int main(int argc,char* argv[])
{
    int i,f ,rfd,wfd;
    char c_buf[32];
    fd_set write_fd,read_fd;
    struct timeval net_timer;

    if(access(FIFO_I,F_OK) == -1){
        if(mkfifo(FIFO_I,0666) == -1 && errno != EEXIST){ //S_IWUSR|S_IRGRP|S_IRUSR|S_IROTH
            printf("cannot create filo_1 file \n");
            exit(1);
        }
    }
    if(access(FIFO_II,F_OK) == -1){
        if(mkfifo(FIFO_II,S_IWUSR|S_IRGRP|S_IRUSR|S_IROTH) == -1 && errno != EEXIST){
            printf("cannot create filo_2 file \n");
            exit(1);
        }
    }

    wfd = open(FIFO_I,O_WRONLY|O_NONBLOCK);
    rfd = open(FIFO_II,O_RDONLY|O_NONBLOCK);
    if(rfd == -1 || wfd == -1){
        printf("open failed rfd = %d , wfd = %d \n",rfd , wfd);
        exit(1);
    }

    while(1)
    {
        FD_ZERO(&read_fd); 
        FD_SET(rfd,&read_fd);
        FD_SET(fileno(stdin),&read_fd);

        net_timer.tv_sec = 5;
        net_timer.tv_usec = 0;
        memset(c_buf,0x0,sizeof(c_buf));
        if( i = select(rfd + 1, &read_fd,NULL,NULL,&net_timer) < 0)
            continue;
        
        if(FD_ISSET(rfd,&read_fd))
        {
            if(read(rfd,c_buf,sizeof(c_buf)) <= 0 )
            {
                if(errno ==EAGAIN) printf("no data yet\n");
            }
            else
                printf("read buf : %s \n",(char*)c_buf);
        }

        if(FD_ISSET(fileno(stdin),&read_fd))
        {
            fgets(c_buf,sizeof(c_buf),stdin);
            int len = write(wfd,c_buf,strlen(c_buf));
            printf("write len = %d \n", len);
        }

    }
    close(rfd);
    close(wfd);
    return 0;
}
C++进程间通信 匿名管道和命名管道 C++进程间通信 匿名管道和命名管道 阅读详情

相关推荐

C# C++ 使用命名管道进行进程通信

实现的功能:C#和C++的应用程序运行时,这两个进程间可以进行进程通信,互相发送和接收消息。 之前看了很多网上的代码写进程通信,大多数都是讲C#——C#或C++——C++这种相同类型的应用程序间的通信,很少有C#-&gt;C++或C++-&gt;C#这种不同类型的应用程序间的通信。但仔细想想,系统中的进程通过创建、连接管道(Pipe)完成进程通信,那么这个创建、连接的过程,张三有张三的创建方法,...

SimonSmile的博客 2665

C++开发基础之命名管道用法详解含示例程序

命名管道(Named Pipe)是一种在操作系统中用于进程间通信的机制。它允许不相关的进程通过共享一个命名的管道来交换数据。命名管道可以在本地计算机上的进程之间进行通信,也可以在不同计算机上的进程之间进行跨网络通信。命名管道的创建和使用类似于传统的匿名管道(Anonymous Pipe),但有一些重要的区别。首先,命名管道是具有唯一名称的,而匿名管道是无名的临时管道。其次,命名管道可以在不同的进程之间进行通信,而匿名管道仅限于父子进程或相关进程之间的通信。

dotnet研习社 2819

C#与C++交互开发系列(十八):跨进程通信之命名管道(Named Pipes)

在 C# 和 C++ 应用程序之间进行数据交换时,命名管道(Named Pipes)是一种简单高效的进程间通信(IPC)方式。命名管道提供了可靠的双向通信通道,适合用于同一台机器上的跨进程通信。本文将深入介绍如何在 C# 和 C++ 程序中使用命名管道进行数据传输,包括详细的示例代码,帮助读者在实践中使用并调试这一技术。命名管道是 Windows 提供的一种 IPC 机制,支持双向数据流。与匿名管道不同,命名管道可以跨进程、跨用户访问。

dotnet研习社 2514

C++进程通信之命名管道

一个命名管道是一个命名的,单向或双面管道的管道服务器和一个或多个管道客户端之间的通信。命名管道的所有实例共享相同的管道名称,但每个实例都有自己的缓冲区和句柄,并为客户端/服务器通信提供单独的管道。实例的使用使多个管道客户端能够同时使用同一个命名管道。这里要理解实例的概念:当我用CreateNamedPipe在服务器端创建一个名为pipeTest的命名管道时,即pipeTest拥有了一个实例。再次重复刚才的操作时,即创建了pipeTest的第二个实例;

m0_38107106的博客 2072

使用C++编程进行命名管道的IPC通信

命名管道是一种特殊类型的文件,它允许不相关的进程通过读写该文件来进行通信。在本文中,我们将探讨如何使用C++编程创建和使用命名管道进行IPC通信。这样,我们就完成了使用C++编程进行命名管道的IPC通信的示例。通过命名管道,不同的进程可以通过读写共享的文件来进行通信,实现进程间的数据交换。父进程向命名管道写入一条消息,并从命名管道读取子进程的响应消息。在其他平台上,我们可以选择任意的文件路径作为命名管道的名称。函数来创建命名管道,并指定管道的属性。函数来创建管道文件,并指定文件的权限。

TechO_O的博客 285

精通Visual C++:Windows 2000编程中的命名管道

本文深入探讨了Ben Ezzell所著《精通Windows 2000编程 with Visual C++》一书的第25章,重点介绍了命名管道的创建和特性。通过详细解析CreateNamedPipe函数的参数和命名管道的属性,我们了解了如何在Windows 2000环境下使用Visual C++编写程序,以实现进程间通信。

weixin_28746457的博客 456

命名管道详解

1、命名管道与匿名管道一个很显著的区别是:匿名管道只能在有血缘关系的进程间进行通信,但命名管道可以让两个毫无关系的进程进行通信。2、如果我们想在不相关的进程间交换数据,我们可以用到FIFO文件来进行通信,这个文件也被称之为命名管道。3、命名管道其实就是一种特殊的文件类型。

qq_64484137的博客 2074

Unity动态创建Avatar骨骼映射

Unity Avatar骨骼映射动态创建,适配Unity通用动画,无需经过第三方建模软件,可运行时创建

Nbin_Newby的博客 1万+

c++ 进程间通信——命名管道

命名管道(NamedPipe) 简介: 命名管道(NamedPipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是:命名管道可以在不相关的进程之间 和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程 通信。命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信...

shenmingyi.blog.youkuaiyun.com 3223

告别C盘爆红!手把手教你将WSL2下的Ubuntu 22.04完整迁移到D盘(附清理指南)

本文详细指导如何将WSL2下的Ubuntu 22.04从C盘无损迁移到D盘,包括导出备份、注销原系统、导入新位置等关键步骤,并提供迁移后的优化配置、开发环境衔接及长期维护技巧,帮助用户彻底解决C盘空间不足问题。

weixin_28698059的博客 474

【数字图像处理第四版课后习题答案】第2章 数字图像基础(含英文原版)

如图 P2.3 所示,视网膜图像中与点相对应的直径 x 是由类似的三角形得到的。即得出 x = 0.085d。根据第 2.1 节中的讨论,并结合一些自由解释,我们可以将眼窝视为一个方形传感器阵列,拥有大约 337,000 个元素,这相当于一个大约 580×580 个元素的阵列。假设元素间距相等,则在 1.5 毫米长的直线上有 580 个元素和 579 个空间,共计 1,159 个。换句话说,如果一个点的直径 d<1.3×10-6 m,或者 d<15.3×10 m,眼睛就无法检测到这个点。

weixin_56463218的博客 1万+

C++与Python通过命名管道进行通信

C++与Python通过命名管道进行通信 最近写项目用到了C++与Python,两个之间需要通信,所以就记录一下自己的学习过程防止自己忘记,代码主要参考这篇博主的博客,上链接: 参考博客 我主要需要的是C++发送,Python来接收,稍微改了一下,代码如下: C++发送: #include <Windows.h> #include <iostream> //发送数据的字节数 #define BUF_SIZE 2 using namespace std; int main() {

Allen_Duke的博客 2782

【Docker】如何让docker容器正常使用nvidia显卡

描述了如何在docker容器中使用英伟达显卡的过程和问题解决方法。

NameLoadingFailed的博客 8372

python与C++通过命名管道通讯

import win32pipe, win32file, pywintypes def recv(): print("pipe recv") quit = False while not quit: try: handle = win32pipe.CreateNamedPipe( # r'\\.\p...

你悄悄的来到了我的博客 2476

SAP VF01开票报错:出口贸易数据不完整

找了半天资料,最后发现是没有维护凭证抬头的数据;由于我不是SD模块顾问,整体流程使用的是原本环境里面的数据,用新建工厂引用,所以也不知道为啥会出发这个贸易业务。正常传到FICO模块,生成会计凭证、获利分析、利润中心及CO凭证。需要维护这三个字段后才能正常转到FI生成会计凭证。VF01开票报错:出口贸易数据不完整。

MaiKouBei的博客 1543

如何使用C#自带的GDI+双缓冲类BufferedGraphics实现双缓冲功能

小白摸索着编写一个上位机界面,将遇到的问题及解决方法记录下,以供后来的小白使用哈。这篇文章解决的问题是在绘图时候的闪烁问题。其中网上有些介绍的设置控制方式controlstyle的方法,这个方法我的理解是比较适合于在一个完整的窗口当中绘图。如果要在一个窗口当中的内部容器或者控件内画图的话就不太适合,通常按照前述的方法设置后没有任何效果。对于在窗口内部的绘图的来说,比较有效的方法是在内存当中开辟一块

z20110411的博客 4795

C++和C#进程间通过命名管道来通信(附源码)—上

C++和C#进程之间通过命名管道通信(上) “命名管道”是一种简单的进程间通信(IPC)机制。命名管道可在同一台计算机的不同进程之间,或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。用命名管道来设计应用程序实际非常简单,并不需要事先深入掌握基层网络传送协议(如TCP/IP或IPX)的知识。因为命名管道利用了微软网络提供者(MSNP)重定向器,通过一个网络,在各

码熊之家 7748

一文吃透!C#上位机CAN总线通信开发:从协议解析到数据可视化

CAN底层协议仅定义了8字节数据的传输规则,实际业务需自定义应用层协议,实现多类型数据的有序传输,这是数据解析的核心。仲裁ID(16进制)数据长度(DLC)数据场格式业务含义解析规则0x0014字节0~3:温度数据温度采集(单位:℃)4字节→float类型(大端/小端需统一,如西门子PLC格式)0x0022字节0~1:转速数据电机转速(单位:r/min)2字节→short类型(Int16)0x0031字节0:bit0~bit7设备状态(8路开关量)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 846

C++和C#进程之间通过命名管道通信(上)

C++和C#进程之间通过命名管道通信(上) “命名管道”是一种简单的进程间通信(IPC)机制。命名管道可在同一台计算机的不同进程之间,或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。用命名管道来设计应用程序实际非常简单,并不需要事先深入掌握基层网络传送协议(如TCP/IP或IPX)的知识。因为命名管道利用了微软网络提供者(MSNP)重定向器,通过一个网络,在各进程间建立通信。这样一来,应用程序便不必关心网络协议的细节。 命令管道是围绕Windows文件系统设计的一种机.

GJ_007的博客 930

Veritas NetBackup8.1.1客户端安装

1.在客户机打开安装包运行Browser 2.选择NetBackup Client Software Installation 3.下一步 4.接受,下一步 5.我选择自定义安装,下一步 6.我选择安装到D盘 7.默认下一步 8.使用域管理账户 9.输入服务器安装了服务端的那一台名称 10.输入服务端生成的令牌,选择“I recognize the fingerprint for this host.Proceed with the certificate deploymen”下一步

万物皆可学 2万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++和C#进程间通过命名管道来通信

C++和C#进程之间通过命名管道通信(上) “命名管道”是一种简单的进程间通信(IPC)机制。命名管道可在同一台计算机的不同进程之间,或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。用命名管道来设计应用程序实际非常简单,并不需要事先深入掌握基层网络传送协议(如TCP/IP或IPX)的知识。因为命名管道利用了微软网络提供者(MSNP)重定向器,通过一个网...

beattwo的专栏 340

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

c++ 与windows服务的通讯_Windows 命名管道研究初探

Industrial frame with yellow pipelines and other objects against the white brick wall background. Vector illustration隶属于 360 公司信息安全中心,我们深谙“未知攻,焉知防”,团队成员专注于各类漏洞利用研究,在红蓝对抗、区块链安全、代码审计拥有多年资深经验。author...

weixin_42470362的博客 295

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

通过命名管道实现C#与C++进程间通信

与匿名管道不同,命名管道具有明确的名称,可以在不相关的进程之间建立通信通道,支持双向数据传输,并且可以同时被多个客户端进程连接。命名管道采用文件系统风格的命名方式,在Windows系统中通常以".\pipe\管道名"的形式存在,提供了可靠、有序的数据传输服务,广泛应用于需要进程间数据共享和通信的场景,如客户端-服务器应用程序、系统服务与用户程序之间的数据交换等。,通过命名管道发送一个指令,服务端根据这个指令进行实际的操作,然后返回操作的结果。这三个常量定义了命名管道的访问方向,控制数据在管道中的流动方向。

dotNET跨平台 130

C++管道通信实战:从匿名管道到命名管道的原理与实现

进程间通信(IPC)是操作系统协调多个进程协同工作的核心技术,它允许不同进程安全高效地交换数据。在Linux/Unix环境中,管道通信作为一种经典的IPC机制,其原理基于内核缓冲区实现单向数据流,通过文件描述符进行读写操作,具备自动同步和阻塞特性。这种设计在技术价值上提供了简单可靠的流式数据传输方案,尤其适用于生产者-消费者模型,避免了共享内存等复杂同步问题。在应用场景中,匿名管道常用于具有亲缘关系的进程间通信,如Shell命令管道(|)和父子进程数据传递;而命名管道(FIFO)则通过文件系统路径名,支持无

weixin_30493401的博客 391

深入解析 Windows C++ 命名管道:从原理到双向通信实战

本文详细介绍了Windows平台下使用命名管道实现进程间通信(IPC)的技术方案。命名管道支持双向通信、网络传输和多客户端连接,相比匿名管道具有明显优势。文章从核心API(CreateNamedPipe、ConnectNamedPipe等)入手,重点阐述了"互为服务端/客户端"的双管道架构设计,通过两条独立管道实现进程间的双向主动通信。结合真实代码案例,分析了Qt程序与后台服务间的双向通信实现,包括线程安全处理、心跳机制等关键细节,并指出了重连机制、消息边界等改进方向。

weixin_51775138的博客 563
上一篇: GCC编译器编译过程
下一篇: 安装GCC教程
hack_tian
博客等级 码龄16年 38粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值