昨天准备做一个程序,PHP的串口扩展程序,用来做串口打开的,于是用dio_fdopen来新建一个文件:

view plaincopy to clipboardprint?

1.

2.<?php

3. $ff = dio_fdopen(1);

4. ?>

每个打开的文件都会被分配一个文件描述符.[1]stdin, stdout, 和stderr的文件描述符分别是0, 1, 和 2. 对于正在打开的额外文件, 保留了描述符3到9. 在某些时候将这些格外的文件描述符分配给stdin, stdout, 或者是stderr作为临时的副本链接是非常有用的.

view plaincopy to clipboardprint?

1.<?php

2.$ff = dio_fdopen(21);

3.?>

返回:Bad file descriptor。

查看PHP扩展的源代码,如下:

PHP的最新扩展:dio_open代码片段摘录。

view plaincopy to clipboardprint?

1. /* {{{ proto resource dio_fdopen(int fd)

2. Returns a resource for the specified file descriptor. */

3.PHP_FUNCTION(dio_fdopen)

4.{

5. php_fd_t *f;

6. long lfd;

7. int fd;

8.

9. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lfd) == FAILURE) {

10. return;

11. }

12.

13. fd = (int)lfd;

14.

15. if ((fcntl(fd, F_GETFL, 0) == -1) && (errno == EBADF)) {

16. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad file descriptor %d", fd);

17. RETURN_FALSE;

18. }

19.

20. if (!new_php_fd(&f, fd)) {

21. RETURN_FALSE;

22. }

23.

24. ZEND_REGISTER_RESOURCE(return_value, f, le_fd);

25.}

返回错误在这一块,如下:

view plaincopy to clipboardprint?

1.if ((fcntl(fd, F_GETFL, 0) == -1) && (errno == EBADF)) {

2. php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad file descriptor %d", fd);

3. RETURN_FALSE;

4. }

这儿涉及到fcntl函数的调用返回有问题,查其相关参数:

F_GETFL : 用来读取open系统调用第二个参数设置的标志,即文件的打开方式(O_RDONLY,O_WRONLY,O_APPEND等),它不需要第三个参数。实际上上这时函数返回的是file结构中的flags域。

其相当于只是创建了一个文件,并未确定这个文件的状态。在C里会补上一个 O_RDWR,

fd = open ("hole", O_CREAT, S_IRWXU | S_IRWXG) ;

变为:

fd = open ("hole", O_CREAT | O_RDWR, S_IRWXU | S_IRWXG) ;

fcntl这个系统调用功能比较多,可以执行多种操作,其内核函数在fs/fcntl.c中定义:

1.入口参数:

(1)fd:欲访问文件的文件描述符

(2)cmd:要执行的操作的命令,这个参数定义了10个标志,下面介绍其中的5个,

F_DUPFD、F_GETFD、F_SETFD、F_GETFL和 F_SETFL

(3)arg:可选,主要根据第二个命令来决定是否需要

2.出口参数:根据第二个参数的不同,这个返回值也不一样。

3.函数功能:

第二个参数是F_DUPFD,则进行复制文件描述符的操作。它需要用到第三个参数arg,这时arg是一个文件描述符,fcntl(fd,F_DUPFD,arg)在files_struct结构中从指定的arg开始搜索空闲的文件描述符,找到第一个后,将fd的内容复制进来,然后将新找到的文件描述符返回。

第二个参数是F_GETFD,则返回files_struct结构中close_on_exec的值。无需第三个参数。

第二个参数是F_SETFD,则需要第三个参数,若arg最低位为1,则对close_on_exec置位,否则清除close_on_exec。

第二个参数是F_GETFL,则用来读取open系统调用第二个参数设置的标志,即文件的打开方式(O_RDONLY,O_WRONLY,O_APPEND等),它不需要第三个参数。实际上上这时函数返回的是file结构中的flags域。

第二个参数是F_SETFL,则用来对open系统调用第二个参数设置的标志进行改变,但是它只能对O_APPEND和O_NONBLOCK标志进行改变,这时需要第三个参数arg,用来确定如何改变。函数返回0表示操作成功,否则返回-1,并置一个错

php扩展dio,PHP Dio扩展新函数dio_fdopen参数返回--bad file descriptor的分相关推荐

  1. python怎么让输出结果为01_python函数基础-参数-返回值-注释-01

    什么是函数 函数就是有特定功能的工具 #python中有内置函数(python解释器预先封装好的)与自定义函数(用户自定义封装的)之分 为什么要用函数 #可以减少代码冗余,增加代码复用性#使代码逻辑更 ...

  2. Java 函数的参数引用,通过传入参数带回函数运行结果

    Java没有指针,在需要由参数直接带回结果的情况下,较C语言相比有一些区别,C语言中任何类型可通过指针传递,在Java中,需要自定义一个类(标准类型不能带回参数),而这个自定义类可以通过函数的参数返回 ...

  3. ES6 | let 关键字 + const关键字 + 箭头函数 + rest参数 + 扩展运算符 ... + Symbol + 迭代器 + 生成器 + 变量的解构赋值 + 模板字符串

    目录 ECMASript 相关介绍 ECMASript 6 新特性 let 关键字 const关键字 变量的解构赋值 模板字符串 简化对象写法 箭头函数 => 参数默认值 rest参数 扩展运算 ...

  4. Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口...

    Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口. Surface UEFI 提供新功能,如启动更快速.安全性更高.可替换 ...

  5. 【php7扩展开发四】函数的参数 ,引用传参 ,返回值

    函数参数解析 之前我们定义的函数没有接收任何参数,那么扩展定义的内部函数如何读取参数呢?用户自定义函数在编译时会为每个参数创建一个zend_arg_info结构,这个结构用来记录参数的名称.是否引用传 ...

  6. 批量给没有扩展名的文件追加新的扩展名从而修改文件名

    概要:我们平常在整理文件的时候,有一些文件是没有扩展名的,虽然这种情况对于普通人来说基本上遇不到,但是对于有些专业人士来说的话,平常有一些接触到的一些文件很多都是没有扩展名的,那么如何给这些文件添加新 ...

  7. c语言扩展运算符是什么,扩展运算符的6个重要用途

    前言 由于ES6和Babel的出现,编写JavaScript代码变得难以置信的灵活,从新的语法到自定的编译器,像JSX.我变成了扩展运算符(Spread Operator)的超级粉丝,三个点就改变你编 ...

  8. matlab创建一个函数,matlab定义一个新函数

    本文收集整理关于matlab定义一个新函数的相关议题,使用内容导航快速到达. 内容导航: Q1:matlab怎么建立自定义函数 自定义函数的格式: function 函数名(参数) 函数表达式 end ...

  9. azure linux 多磁盘 lvm,EVE-NG扩展磁盘空间(扩展LVM卷)

    环境准备 系统环境:EVE-PRO-VM-2.0.4-20 前期是使用ova导入安装,精简置备,40G虚拟磁盘容量.空间不足,尝试了很久,记录操作记录如下:血泪教训:操作不当有可能引起数据丢失,需要提 ...

最新文章

  1. 生信服务器 | 更改 CentOS/RHEL 6/7 中的时区
  2. Fast RCNN 训练自己的数据集(3训练和检测)
  3. 机器人庄园作文_小学生的科幻作文
  4. Winform中实现批量文件复制(附代码下载)
  5. 我与Linux系统的交集
  6. 在.NET Core中使用MongoDB明细教程(3):Skip, Sort, Limit, Projections
  7. OpenShift 4之设置用户/组对项目的访问权限
  8. 用户界面和兼容性测试
  9. CentOS下编译安装Gcc-4.9
  10. Win10自带超级截屏利器
  11. python视频教程唐学韬-python
  12. 【编译原理】 CS143 斯坦福大学公开课 第一周:简介
  13. You should consider upgrading via the
  14. 方根法公式_方根的简易算法
  15. 查看linux下tomcat启动日志
  16. 【航拍中国】广东笔记
  17. Mysql 无障碍轻松学习(二)数据库利器DataGrip 下载与无限期试用
  18. Solidworks 无法显示略缩图解决办法
  19. My97 日期改变事件
  20. 文件系统:FAT16

热门文章

  1. 基于Session共享的单点登录或通行证系统方案
  2. #pragma warning(pop) 和 #pragma warning(push)的作用
  3. 如何在maven的setting.xml中指定jdk版本(详细步骤)
  4. Zookeeper02_zk集群搭建
  5. JVM从入门到精通(十一): CMS日志详解,G1日志详解,JVM常见参数总结;补充纤程知识
  6. 【Python】利用graphviz和pycallgraph库自动生成Python函数调用关系图
  7. nodejs中使用worker_threads来创建新的线程
  8. 分布式块存储QoS限速算法介绍与实践以及对上层应用的影响
  9. Hadoop2.2.0+HA+zookeeper3.4.5详细配置过程+错误处理(一)
  10. 相对湿度计算软件_空调工程负荷详细计算方法(附有实例)