`
alian
  • 浏览: 16607 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

[转]Windows下模拟linux pipe

 
阅读更多
linux下的管道可以通过select来捕获事件,在某些场景下非常有用,但Windows下提供的管道就不具备这种特性,为了在Windows环境下也可以实现类似的功能特性,可以用socket模拟pipe实现。代码如下:
from http://blog.chinaunix.net/space.php?uid=736168&do=blog&cuid=705924

int pipe( int fildes[ 2] )
{
    int tcp1, tcp2;
    sockaddr_in name;
    memset ( & name, 0, sizeof ( name) ) ;
    name. sin_family = AF_INET ;
    name. sin_addr. s_addr = htonl ( INADDR_LOOPBACK ) ;
    int namelen = sizeof ( name) ;
    tcp1 = tcp2 = - 1;

    int tcp = socket ( AF_INET , SOCK_STREAM , 0) ;
    if ( tcp = = - 1) {
        goto clean;
    }
    if ( bind ( tcp, ( sockaddr * ) & name, namelen) = = - 1) {
        goto clean;
    }
    if ( listen ( tcp, 5) = = - 1) {
        goto clean;
    }
    if ( getsockname ( tcp, ( sockaddr * ) & name, & namelen) = = - 1) {
        goto clean;
    }
    tcp1 = socket ( AF_INET , SOCK_STREAM , 0) ;
    if ( tcp1 = = - 1) {
        goto clean;
    }
    if ( - 1 = = connect ( tcp1, ( sockaddr * ) & name, namelen) ) {
        goto clean;
    }

    tcp2 = accept ( tcp, ( sockaddr * ) & name, & namelen) ;
    if ( tcp2 = = - 1) {
        goto clean;
    }
    if ( closesocket( tcp) = = - 1) {
        goto clean;
    }
    fildes[ 0] = tcp1;
    fildes[ 1] = tcp2;
    return 0;
clean:
    if ( tcp ! = - 1) {
        closesocket( tcp) ;
    }
    if ( tcp2 ! = - 1) {
        closesocket( tcp2) ;
    }
    if ( tcp1 ! = - 1) {
        closesocket( tcp1) ;
    }
    return - 1;
}


缺点很明显
1、效率低下。
2、占用了两个TCP端口。
3、accept的返回值未必就是tcp1连接过来的(多线程或者别的进程在干预), 所以最好通过发送数据进行确认。
4、由于不是匿名的, 所以可以在netstat里面看到。
优点只有一个, 可以使用select调用。
分享到:
评论

相关推荐

    PIPE petri-net分析工具

    3. **模拟与执行**:通过模拟,用户可以观察Petri网模型在不同初始条件下的行为,预测系统可能的行为路径。 4. **性能分析**:PIPE还可以进行性能评估,如计算平均响应时间、吞吐量等关键性能指标,为系统优化提供...

    Windows进程内标准输出重定向.pdf

    7. Windows和Linux平台间的差异:文档可能提到了如何在Windows平台上模拟类似Linux的文件描述符操作,因为在Windows中使用的是句柄(handle),而不是文件描述符。 8. 关键类`StdoutToDebugString`:在文档中定义了...

    drient.h和unistd.h

    这些库提供了模拟Linux API的接口,使得可以在Windows环境下编译和运行原本为Linux设计的代码。另外,`MinGW`或`MSYS2`也可以帮助你构建一个接近于Linux环境的开发环境。 总之,`dirent.h`和`unistd.h`是Linux开发...

    命令均在GitBash下完成兼容Linux和Mac

    Git Bash是一个为Windows系统提供的模拟Unix shell的工具,它允许用户在Windows上使用类似于Linux或Mac的命令行体验。 描述中的“命令均在Git Bash下完成,兼容Linux和Mac”进一步强调了这些命令的跨平台特性。在...

    linux简介与ubuntu20.04安装教程.docx

    - **双系统安装**:在同一台计算机上安装两个操作系统(如Windows和Linux),用户可以选择启动时使用的系统。 - **虚拟机安装**:在已有的操作系统(如Windows)上安装虚拟机软件,再通过虚拟机软件安装Linux系统。 ...

    PIPEv4.2.1.zip

    - **模拟执行**:用户可以模拟Petri网的行为,观察系统在不同初始状态下的动态演变,帮助理解系统的运行机制。 - **转换和优化**:编辑器可能提供转换和优化功能,将复杂的Petri网模型转化为更简单的形式,或者优化...

    linux 课程设计

    在Windows平台的设计题目中,虽然具体的技术细节可能不同,但基本原理和Linux平台相似,包括进程调度、内存管理、磁盘调度等,这些都是操作系统设计的基础组成部分。 通过这些课程设计,学生能深入理解操作系统的...

    01.漫谈兼容内核之一:Wine的系统结构.pdf

    Wine作为一个重要的兼容层,被设计用于让Windows应用程序能够在非Windows操作系统(如Linux)上运行。它不仅仅是一个简单的转换工具,而是包含了复杂的系统架构和服务机制。本文旨在探讨Wine的核心组件及其工作原理...

    如何在Linux下设置录音笔时间

    在Linux环境下,对录音笔进行时间设置可能会遇到一些挑战,特别是当录音笔依赖于特定的Windows应用程序时。本文将详细讲解如何在Linux下为录音笔设置时间,避免使用不兼容的Windows程序,并解决Linux系统中与此相关...

    wine的系统结构.docx

    Wine,全称“Wine Is Not an Emulator”,是一种开源软件,其主要目标是使Linux和其他类Unix操作系统能够运行原本设计为在Microsoft Windows环境下运行的应用程序。Wine通过创建一个兼容层,模拟Windows API,实现了...

    操作系统实验五

    - **Ubuntu**:作为实验的操作系统平台,提供了一个稳定的Linux环境。 - **GCC**:用作C语言编译器,用于编译和链接实验所需的C语言代码。 #### 实验过程 ##### 题目一:进程间的管道通信 1. **实验设计**: - ...

    Ruby-ClipboardRuby访问WindowsLinuxmacOSJava和Cygwin中剪贴板

    在Cygwin中,`Clipboard`库可能会依赖于Windows API或者模拟Linux的行为。确保`clipboard` gem已安装,然后按照Windows的用法进行操作。 总结起来,`Clipboard`库为Ruby开发者提供了一种跨平台的方式来访问剪贴板,...

    mqueue:一个为windows获取POSIX消息队列的实验项目

    在Windows环境下,通常使用的进程间通信方式有管道(pipe)、套接字(socket)、共享内存、命名管道(named pipe)等,但这些机制可能无法满足所有需求,尤其是在需要保持消息顺序或者支持优先级的场景下。...

    OS.zip_visual c

    开发者可以使用MinGW-w64这样的工具,它提供了一个模拟Windows API的环境,使Visual Studio项目能在Linux下编译和运行。通过设置编译选项和链接库,C++代码可以被编译为适应Linux环境的可执行文件。 在Visual C++中...

    操作系统实验报告

    【操作系统实验报告】 ...同时,实验还让学生对比了Linux和Windows操作系统的特点,认识到Linux的编译系统强大,而Windows提供了更直观的用户界面。这些经验对于深入理解操作系统和软件开发具有重要意义。

    pevents-master.zip

    `pevents-master`这个项目可能就是针对这个问题提供的一种解决方案,它可能是通过用户空间的实现来模拟Windows Event对象的行为。开发者可能使用了内核提供的异步通知机制(如`epoll`、`poll`或`select`)和线程同步...

    Git_2.9.3-32-bit.rar

    Git_2.9.3-32-bit.rar 是一个针对32位操作系统的Git的特定版本压缩包,其中包含了GitBash,这是一个在Windows环境下模拟Linux命令行环境的工具,使得用户可以在Windows上充分利用Git的强大功能。 Git的核心概念包括...

Global site tag (gtag.js) - Google Analytics