在阅读涉及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;
我的诚实猜测是,在这种特殊情况下,阻塞信号会阻止设置过程被中断。但我完全不确定。请帮帮忙?
答案 0 :(得分:0)
https://support.sas.com/documentation/onlinedoc/sasc/doc750/html/lr1/zlocking.htm
你的猜测是正确的,它应该可以防止线程中断。 上面的链接不是特定于pthreads但概念是相同的,我认为很好解释
编辑: pthreads关于阻塞信号的解释 http://maxim.int.ru/bookshelf/PthreadsProgram/htm/r_40.html