c++在构造函数中打开了文件成员函数却无法读写文件

编写一个基于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是同一个值
code_fd/code值的测试

阅读 4.7k
2 个回答

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题