linux - c++在构造函数中打开了文件成员函数却无法读写文件
大家讲道理
大家讲道理 2017-04-17 15:50:31
[Linux讨论组]

编写一个基于v4l2的摄像头程序,在类的构造函数中打开了文件,然后在成员函数中操作文件

video::video(const char* dir) {
    ...
    if((_fd = open(dir, O_RDWR)) < 0) {
        throw fileException();
    }
    ...
}

void video::videoInit() {
    struct v4l2_format fmt;
    CLEAR(fmt);
    fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
    fmt.fmt.pix.height = 1280;
    fmt.fmt.pix.width = 720;
    fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
    fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
    if(ioctl(_fd, VIDIOC_S_FMT, &fmt) < 0)
    ...
}

但是在成员函数中却无法用ioctl对设备进行操作,和open在同一个函数内才能用ioctl操作
请问是为什么呢,是因为构造函数执行完后自动关闭了文件吗,怎样才能在成员函数中也能操作?
编译环境是g++ (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609


这是根据 @jeppeter 所提到的原因进行的测试,两个函数中_fd是同一个值

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(2)
PHPz

没有看到你的全部代码,但从你给出的代码看,你应该在ioctl之前判断_fd的值,如果这个值是非法,那就要处理一下,很可能是因为你没有初始化成功这个_fd

大家讲道理

最开始因为是这句有问题:

if((_fd = open(dir, O_RDWR)) < 0)

C++里面对运算顺序是未定义的,上述句子可能从右往左运行, 这样_fd只会取值0或者1. 但是后来看到LZ打印出来的都是3... 难道是debug和release下的区别?

LZ有没有试过在ioctl成功时候打印出_fd的值?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号