编写一个基于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
是同一个值
付费偷看金额在0.1-10元之间
最开始因为是这句有问题:
没有看到你的全部代码,但从你给出的代码看,你应该在ioctl之前判断_fd的值,如果这个值是非法,那就要处理一下,很可能是因为你没有初始化成功这个_fd
C++里面对运算顺序是未定义的,上述句子可能从右往左运行, 这样_fd只会取值0或者1. 但是后来看到LZ打印出来的都是3... 难道是debug和release下的区别?
if((_fd = open(dir, O_RDWR)) < 0)
LZ有没有试过在ioctl成功时候打印出_fd的值?
一周热门 更多>