`
arksea
  • 浏览: 63742 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Windows平台下erlang的port进程关闭标准输入输出的方法

阅读更多

为了避免与port进程的通信受一些printf调试信息的影响,通常都要关闭或者替换标准输入输出。

Unix平台下,open_port只要指定nouse_stdio参数就可以让port进程使用fd 3、4作为通信信道,

而在Windows平台下并没有所谓的3、4 fd可用,调用fdopen(3,“rb”)将会出错,这时可以使用

dup和dup2手动进行替换,例子如下:


port测试进程C代码

 

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <windows.h>

int main(int argc, char* argv[])
{
    //复制stdio fd,之后我们将使用复制的句柄与Erlang通信
    FILE* f0 = fdopen(dup(0),"rb");
    FILE* f1 = fdopen(dup(1),"wb");

    //Windows下默认为Text模式,按需要设置为BINARY模式,
    //否则\n将会被替换为\r\n,这通常不是我们想要的
    _setmode (_fileno(f0), _O_BINARY);
    _setmode (_fileno(f1), _O_BINARY);

    //用一个临时文件替换stdio,并关闭之
    FILE* ftmp = tmpfile();
    dup2(fileno(ftmp), 0);
    dup2(fileno(ftmp), 1);
    fclose(stdin);
    fclose(stdout);
    fclose(ftmp);
    //测试一些输出
    fwrite("hello",1,5,f1);
    fputc(' ',f1);
    fflush(f1);
    printf("world");
    fflush(stdout);
    std::cout << "!!!!!\n";
    std::cout.flush();
    Sleep(5000);

	return 0;
}

 

 

测试用erlang代码:

 

-module(test).
-compile(export_all).

start() ->
  P = open_port({spawn, "./Debug/teststdio.exe"},[binary]),
  loop(P).
  
loop(P) ->
  receive
    {P, {data, Data}} ->
 	io:format("~p~n",[Data]),
 	loop(P)
  after 3000 ->
    timeout
  end.

 

 

测试结果:

 

1、替换stdio后:

Eshell V5.7.5  (abort with ^G)
1> c(test.erl).
{ok,test}
2> test:start().
<<"hello ">>
timeout
3>

 

2、如果没有替换stdio,将会收到

test:start().
<<"hello ">>
<<"world">>
<<"!!!!!\r\n">>
timeout

 

我们调用第三方库时很难确认是否会有stdio输出,这种方式很好的避免了printf信息对port通信的影响

 

 注意没有替换stdio部分的输出,stdin和stdout没有指定BINARY模式,\n被替换成\r\n了,

 再看看前面dup2部分的调用,虽然指定了"rb"和"wb",但这样是无效的,必须手动调用setmode进行设置才会有效

 

 最后说说windows下使用异步stdio的注意点,需要2个设置:

1、在open_port中指定overlapped_io参数

2、用_get_osfhandle函数得到替换后的io的HANDLE,以供ReadFile和WriteFile操作:

 

    HANDLE hin = (HANDLE)_get_osfhandle(_fileno(f0));
    HANDLE hout= (HANDLE)_get_osfhandle(_fileno(f1));

 

 在C程序里使用异步io虽然麻烦,但有时候却是必须的。比如windows系统下通过port访问串行口时,如果不使用overlapped模式,读取串口与读取stdio是不能同时进行的。

分享到:
评论
2 楼 mryufeng 2010-08-24  
星爷威武!
1 楼 imyer 2010-06-28  
感谢,感谢。
最近正因为“\n将会被替换为\r\n”
测试了很多方法。
_setmode (_fileno(f1), _O_BINARY); 
后,传输没问题,特别是二进制文件。

相关推荐

    erlang port driver test

    总的来说,这个项目是为了验证和优化 Erlang 在 Linux 环境下通过 Port Driver 与外部程序交互的能力,测试可能涵盖了端口的创建、数据交换、错误处理和资源管理等多个方面。通过这样的测试,开发者可以确保他们的...

    windows下安装Erlang环境

    **脚本语言**:Erlang也可作为脚本语言使用,编写分布式应用尤其方便,因为它的分布式特性和虚拟机支持使得代码跨平台运行变得简单。 安装Erlang的过程包括下载官方提供的安装包,双击运行并按照向导完成安装,之后...

    Erlang的windows版本

    Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的...

    适用于windows版本的 Erlang25.2.3 and RabbitMQ server 3.11.9下载

    2. 故障恢复:Erlang的进程间通信机制允许进程在出现错误时优雅地关闭和重启,增强了系统的容错能力。 3. 分布式:Erlang天生支持分布式计算,可以在多台机器上无缝部署和运行应用程序。 4. OTP(Open Telecom ...

    erlang23.2版windows64位.zip

    这个版本可能包含了对Windows平台的优化,以确保在该系统上高效运行。 描述中的"erlang23.2版windows64位"进一步确认了这个软件包是Erlang 23.2,适用于64位的Windows操作系统。这意味着它能够充分利用64位系统的...

    erlang25.0 windows版本

    在Windows环境下安装Erlang 25.0,你需要下载提供的文件`otp_win64_25.0.exe`。这是一个Windows 64位的可执行安装程序,包含了所有必要的组件来运行Erlang环境。在安装过程中,你通常会遵循以下步骤: 1. **下载**...

    erlang 中进程

    在Erlang中,进程是并发执行的基本单元,它们轻量级且独立,彼此通过消息传递进行通信。下面将详细介绍Erlang中的进程以及如何使用它们进行并发开发。 1. 进程概念 在Erlang中,进程不同于操作系统中的线程或进程。...

    适用于windows版本的 Erlang24 and RabbitMQ server 3.8.16下载

    Erlang otp_win64_24.0是针对64位Windows系统的Erlang OTP(开放电信平台)24.0版本,它包含了一整套开发工具和库,使得开发者可以在Windows环境下利用Erlang的强大功能。 RabbitMQ的3.8.16版本是一个成熟的发布,...

    Erlang26-windows安装包

    RabbitMQ version Minimum required Erlang/OTP Maximum supported Erlang/OTP Notes 3.13.0 26.0 26.2.x The 3.13 release series is compatible wtih Erlang 26. OpenSSL 3 support in Erlang is considered to ...

    Erlang进程模型学习PPT

    Erlang进程模型特点 一个进程可以创建数以万计的轻量级进程 每个轻量级进程仅仅完成单一功能 一个复杂的功能可以由多个轻量级进程协同完成 当遇到file或socket等阻塞的io时, 调用的轻量级进程被阻塞,整个进程不...

    Windows版本Erlang22.3-RabbitMQ3.8.3

    在Windows环境下,安装完Erlang和RabbitMQ后,你需要启动RabbitMQ服务。这可以通过服务管理器(services.msc)完成,或者在命令行中输入`rabbitmq-server start`命令。启动成功后,你可以访问`...

    erlang21.1-windows-64

    在Windows上部署和使用Erlang和RabbitMQ,需要了解Erlang的 OTP(Open Telecom Platform)框架、进程模型、并发原理以及RabbitMQ的基础概念,如队列、交换器、路由键和绑定。同时,熟悉AMQP(Advanced Message ...

    Erlang Windows 64位 安装包

    ESL是一家致力于Erlang生态系统发展的公司,他们发布的版本通常包含了完整的Erlang/OTP(开放电信平台)系统,包括编译器、运行时环境和其他实用工具。 安装Erlang的步骤如下: 1. 下载:首先,你需要从Erlang ...

    erlang 23.1 - windows

    Erlang OTP(开放电信平台)为RabbitMQ提供了健壮的进程模型、分布式数据结构、自动错误检测和恢复机制,这些都是构建高可用、高扩展性的消息队列服务的基础。Erlang 23.1版可能包括性能优化、bug修复以及对某些特性...

    RabbitMQ 3.8.9 + erlang23.1.4 windows 安装包

    如题,RabbitMQ 3.8.9 windows安装包,以及运行环境erlang的安装包。 先安装erlang,设置环境变量“ERLANG_HOME={erlang安装路径}”,添加“%ERLANG_HOME%\bin”到系统变量Path中 再安装RabbitMQ 再到RabbitMQ安装...

    windows 32位和64位 Erlang 21.0.1下载

    This guide covers Erlang/OTP requirements, recommendations, caveats and commonly used installation sources. Unsupported Versions Erlang/OTP versions older than 19.3 are not supported by currently ...

    Windows下使用NIF扩展Erlang完整例子

    Windows下使用NIF扩展Erlang完整例子,包含nif工程项目,erlang引用例子。 配套文章:http://blog.csdn.net/mycwq/article/details/17527485

    erlang_版本24.3.4.4

    Erlang支持多种平台,包括Windows、Linux、macOS等。在下载otp_src_24.3.4.4压缩包后,你需要解压并按照以下步骤进行编译和安装: 1. **解压源码**:将otp_src_24.3.4.4文件解压缩到一个合适的目录,通常是在你的...

    erlang windows安装包(一)

    windows下的erlang安装包,版本为R15,是最新的版本,将安装包拆分成三个压缩文件

    erlang的timer和实现机制

    Erlang中的每个定时器都是一个单独的进程,当设置定时器时,实际上是创建了一个新的进程,并将其加入到时间表中。这个时间表由Erlang虚拟机(VM)维护,负责监控所有已激活的定时器。 定时器进程的工作原理如下: 1...

Global site tag (gtag.js) - Google Analytics