【问题标题】:Why block signals then unblock them?为什么阻塞信号然后解除阻塞?
【发布时间】:2016-05-24 07:45:24
【问题描述】:

在阅读某些涉及 v4l2 API 的源代码时,我偶然发现了这些部分:

第一:

sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigaddset(&set, SIGALRM);
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGTERM);
sigaddset(&set, SIGHUP);
pthread_sigmask(SIG_BLOCK, &set, &old);

然后:

pthread_sigmask(SIG_UNBLOCK, &old, NULL);

介于两者之间:

if (s->pframe >= 0) {
    if (xioctl(s->fd, VIDIOC_QBUF, &s->buf) == -1) {
        motion_log(LOG_ERR, 1, "%s: VIDIOC_QBUF", __FUNCTION__);
        return -1;
    }
}

memset(&s->buf, 0, sizeof(struct v4l2_buffer));

s->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
s->buf.memory = V4L2_MEMORY_MMAP;

if (xioctl(s->fd, VIDIOC_DQBUF, &s->buf) == -1) {

    /* some drivers return EIO when there is no signal, 
       driver might dequeue an (empty) buffer despite
       returning an error, or even stop capturing.
    */
    if (errno == EIO) {
        s->pframe++; 
        if ((u32)s->pframe >= s->req.count) s->pframe = 0;
        s->buf.index = s->pframe;

        motion_log(LOG_ERR, 1, "%s: VIDIOC_DQBUF: EIO (s->pframe %d)", __FUNCTION__, s->pframe);

        return 1;
    }

    motion_log(LOG_ERR, 1, "%s: VIDIOC_DQBUF", __FUNCTION__);

    return -1;
}

s->pframe = s->buf.index;
s->buffers[s->buf.index].used = s->buf.bytesused;
s->buffers[s->buf.index].content_length = s->buf.bytesused;

我的诚实猜测是,在这种特殊情况下,阻塞信号可以防止设置过程被中断。但我完全不确定。请帮忙?

【问题讨论】:

  • 能否按实际顺序显示代码?将中间代码放在其他代码之后会令人困惑。
  • 你的猜测在我看来是正确的。它会阻止这些信号,进行设置,然后将信号掩码恢复到之前的状态。
  • 我猜你不想让视频缓冲区处于中间状态,部分初始化。

标签: c linux signals semaphore


【解决方案1】:

https://support.sas.com/documentation/onlinedoc/sasc/doc750/html/lr1/zlocking.htm

你的猜测是正确的,它应该防止线程中断。 上面的链接不是特定于 pthreads,但概念是相同的,我认为解释得很好

编辑: pthreads 对阻塞信号的解释 http://maxim.int.ru/bookshelf/PthreadsProgram/htm/r_40.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2017-04-26
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    相关资源
    最近更新 更多