c语言打开设备节点read()函数卡住(阻塞住)

遇到问题:在read()数据时一直卡住,只打印log vbidata_process_frame 1-1,却不能打印vbidata_process_frame 1-2 log ,导致主线程卡住,无法更新画面,经过排查,发现vbi->filename这个文件是null的,如果不是已O_NONBLOCK模式open 节点vbi->filename,则在read读取时不满frame_size个字节会阻塞等待,直到读取到frame_size个字节,代码如下。


static void vbidata_open_device(vbidata_t *vbi) {
    struct v4l2_format vfmt;
    double frame_rate;
    int result;

    vbi->fd = open(vbi->filename, O_RDONLY);
    if (vbi->fd < 0) {
        LOGE("vbidata: Can't open %s: %s\n",
             vbi->filename, strerror(errno));
    } else {
        vbi->open = 1;
    }

卡住代码如下:

void vbidata_process_frame(vbidata_t *vbi, int printdebug) {
    int scanline;
    if (vbi->open) {
        LOGD("vbidata_process_frame 1-1 fd=%d",vbi->fd );
        int res=read(vbi->fd, vbi->buf, vbi->frame_size);
        LOGD("vbidata_process_frame 1-2 fd=%d, res=%d, framesize=%d",vbi->fd ,res,vbi->frame_size);
        if (res< vbi->frame_size) {
            if (vbi->verbose) {
                LOGE("vbidata: Can't read vbi data: %s\n",
                     strerror(errno));
            }
        } else {
            /* Find line 21 based the lines we are receiving */
            if ((vbi->startline > 21) ||
                (vbi->startline + vbi->numlines < 21)) {
                /* We don't have the required line */
                LOGE("vbidata: Not receiving line 21 in VBI\n");
            }
            scanline = 21 - vbi->startline;

所以解决办法,在打开文件节点时以非阻塞模式打开,open函数设置O_NONBLOCK参数即可。

    vbi->fd = open(vbi->filename, O_RDONLY|O_NONBLOCK);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值