私のアプリケーションは、別のスレッドで動作するv4l2を使用しています。カメラが切断されると、スレッドをきれいに終了する前に、ユーザーに適切なメッセージが与えられます。これは大多数の場合に有効です。ただし、カメラが切断されたときに実行がVIDIOC_DQBUF ioctl内にある場合、ioctlは返されず、スレッド全体がロックアップします。カメラの切断時にVIDIOC_DQBUFがハングアップする
次のように私のシステムである。
- Linuxカーネル:4.12.0
- OS:Fedoraの25
- コンパイラ:GCC-7.1
以下のの簡略化した例であります問題関数。
// Get Raw Buffer from the camera
void v4l2_Processor::get_Raw_Frame(void* buffer)
{
struct v4l2_buffer buf;
memset(&buf, 0, sizeof (buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
// Grab next frame
if (ioctl(m_FD, VIDIOC_DQBUF, &buf) < 0)
{ // If the camera becomes disconnected when the execution is
// in the above ioctl, then the ioctl never returns.
std::cerr << "Error in DQBUF\n";
}
// Queue for next frame
if (ioctl(m_FD, VIDIOC_QBUF, &buf) < 0)
{
std::cerr << "Error in QBUF\n";
}
memcpy(buffer, m_Buffers[buf.index].buff,
m_Buffers[buf.index].buf_length);
}
このioctlがロックされている理由と、この問題を解決するために何ができるのかについて誰にも分かりますか?
ご協力いただきありがとうございます。
アマンダ