------------------ port 篇 -------------
open_port/2这个是由bif实现, 源文件在erl_bif_port.c中, 函数是BIF_RETTYPE open_port_2(BIF_ALIST_2)
其中:
#define BIF_RETTYPE Eterm
#define BIF_ALIST_2 Process* A__p, Eterm A_1, Eterm A_2
此函数调用了同文件中的
static int
open_port(Process* p, Eterm name, Eterm settings, int *err_nump)
函数.
name 对应 open_port/2的第一个参数PortName
setting 对应 open_port/2的第二个参数PortSettings
其中:
PortSettings = [Opt]
Opt = {packet, N} | stream | {line, L} | {cd, Dir} | {env, Env} | exit_status | use_stdio | nouse_stdio | stderr_to_stdout | in | out | binary | eof
N = 1 | 2 | 4
L = int()
Dir = string()
Env = [{Name, Val}]
Name = string()
Val = string() | false
这些port的设置都由open_port函数Parse the settings注释后面的代码解析. erl_bif_port.c: 475行
第一个参数name的解析由open_port函数Parse the first argument and start the appropriate driver注释后面的代码解析. erl_bif_port.c: 590行
此处解析第一个参数name,并开启正确的driver
PortName = {spawn, Command} | {fd, In, Out}
分两种情况: spawn出来的进程, 使用文件描述符
spawn_driver_entry外部定义, spawn_driver_entry是名为spawn的driver的入口结构体. 它在linux平台上的定义在emulator/sys/unix/sys.c下
struct erl_drv_entry spawn_driver_entry = {
spawn_init,
spawn_start,
stop,
output,
ready_input,
ready_output,
"spawn",
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
ERL_DRV_EXTENDED_MARKER,
ERL_DRV_EXTENDED_MAJOR_VERSION,
ERL_DRV_EXTENDED_MINOR_VERSION,
ERL_DRV_FLAG_USE_PORT_LOCKING
};
erl_drv_entry这个结构体的定义的emulator/beam/erl_driver.h. 结构体的成员包括port初始化, 开始,停止, 取/出数据的各种函数指针(因为运行的平台不同,所以用指针来指定策略).
真正干活的是io.c下面的
/*
Opens a driver.
Returns the non-negative port number, if successful.
If there is an error, -1 or -2 or -3 is returned. -2 means that
there is valid error information in 'errno'.
Returning -3 means that an error in the given options was detected.
The driver start function must obey the same conventions.
*/
int
erts_open_driver(ErlDrvEntry* driver, /* Pointer to driver entry. */
Eterm pid, /* Current process. */
char* name, /* Driver name. */
SysDriverOpts* opts, /* Options. */
int *error_number_ptr) /* errno in case -2 is returned */
函数. io.c: 505行
步骤:
1. 获取一个free的port,取得一个port_num. 通过 static int get_free_port(void)函数来检查, 如果port的status属性为ERTS_PORT_S_FREE则这个port是free的
2. 检查同名的driver是否已经存在.如果存在,则用已有的driver,如果不存在则用默认的spawn/fd driver
3. drv_data = (*driver->start)((ErlDrvPort)port_num, name, opts); 初始化一些东西而已,比如driver名称,driver的io队列等
4. 用已有的名为spawn的driver启动driver, drv_data = (*driver->start)((ErlDrvPort)port_num, name, opts); (unix/sys.c)
5. clean up the port.
6. 返回port_num.
附:名为efile的driver,它的struct erl_drv_entry结构体定义在emulator/drivers/comm/efile_drv.c中, 如下:
struct erl_drv_entry efile_driver_entry = {
file_init,
file_start,
file_stop,
file_output,
NULL,
NULL,
"efile",
NULL,
NULL,
file_control,
file_timeout,
file_outputv,
file_async_ready,
file_flush,
NULL,
NULL,
ERL_DRV_EXTENDED_MARKER,
ERL_DRV_EXTENDED_MAJOR_VERSION,
ERL_DRV_EXTENDED_MINOR_VERSION,
ERL_DRV_FLAG_USE_PORT_LOCKING,
NULL
};
分享到:
相关推荐
NULL 博文链接:https://zzc1684.iteye.com/blog/2237179
Emulator: Process finished with exit code 1 Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT Android Studio 真是废柴!Google,Baidu 查了半天,无论 StackOverflow 还是 CSDN ...
学生党一个,文章内容为个人见解,欢迎大佬纠错。 本学期要学习Android 应用网络编程,下载安装了Android studio 过程中遇到了棘手的问题,记录一下,也希望对同样有类似问题的你有帮助。 个人使用的是Google的最新...
Abrand soft MYM Homa Font for persian text.
基础编辑程序理解
Emulator: emulator: WARNING: EmulatorService.cpp:448: Cannot find certfile: D:\Android\AVD.android\emulator-grpc.cer security will be disabled. Emulator: Started GRPC server at 127.0.0.1:8554
docker-emulator-android:Dockerized android模拟器
BGP命令与配置手册实验,详细的讲述了BGP的各个知识点
Android-Emulator-Detector:用于检测仿真环境中是否正在运行的应用
Emulator: Process finished with exit code 1 Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT 解决方法 设置好系统的环境变量后重启 其中ANDROID_HOME的值为你下载的Sdk的路径, ...
1.Emulator: ERROR: Unable to access ‘C:\Users\琚佹棴鍗歕.emulator_console_auth 这个是在你运行模拟器的时候会出现的一个error,相应的下边还会有一个warning,但是warning并不影响运行,如下图所示: 解决这个...
重庆站 PSX Emulator即将推出:trade_mark: 目前正在从事: 中央处理器,中央处理器和中央处理器
datastore-emulator-docker:Google数据存储模拟器Docker映像
6502_Emulator_Cpp:Cpp中的仿真器
emulator-list:PLAN2021复古游戏及其模拟器的列表
Android-emulator-skins:由Google制造的官方Android模拟器皮肤
11:43 Emulator: [5984]:ERROR:android/android-emu/android/qt/qt_setup.cpp:28:Qt library not found at D:\AndroidSDK\emulator\lib64\qt\lib 11:43 Emulator: Could not launch 'D:\AndroidSDK\emulator/qemu/...
android_emulator插件 入门 该项目是插件。 要开始使用fastlane-plugin-android_emulator ,请通过运行以下命令将其添加到您的项目中: fastlane add_plugin android_emulator 关于android_emulator 创建并启动新...
docker run ridedott/firestore-emulator:latest 入门 这些说明将为您提供在本地计算机上运行的firestore-emulator实例,以进行测试。 先决条件 建立项目的最低要求: 确保对进行。 建筑 VERSION= ` cat ./VERSION `...
[2015-06-04 17:00:41 - Emulator] emulator: ERROR: x86 emulation currently requires hardware acceleration! [2015-06-04 17:00:41 - Emulator] Please ensure Intel HAXM is properly installed and usable. ...