我在我的一个小项目上探索poll()函数,我注意到这个片段崩溃了:
ErrorCode XNotifier_Linux::updatePoll()
{
ErrorCode ret = Success;
struct pollfd descriptors = { m_fd, IN_MODIFY, 0 };
const int nbDescriptors = poll(&descriptors, m_fd+1, 10*1000);
if (descriptors.events & (POLLIN | POLLPRI))
ret = DataIsPresent;
return ret;
}
Valgrind在这里非常有帮助,因为它指出了部分化的民意调查领域ufds
:
==833== Syscall param poll(ufds.fd) points to uninitialised byte(s)
==833== at 0x569CB28: poll (in /lib64/libc-2.14.1.so)
==833== by 0x400F7A: xnot::XNotifier_Linux::updatePoll() (linux.cpp:72)
==833== by 0x400D4B: xnot::XNotifier_Linux::update() (linux.cpp:28)
==833== by 0x400FF4: main (linux.cpp:90)
==833== Address 0x7fefffbb8 is on thread 1's stack
当在堆栈上创建descriptors
时,我理解当函数返回时,指向descriptors
的指针不再有效。我认为在函数返回后可能会使用此指针。为了确认这一点,我将声明描述符的行更改为:static struct pollfd descriptors = { m_fd, IN_MODIFY, 0 };
并且崩溃消失了。
为什么描述符应该比poll()调用更长? (或者有什么我错了吗?)
P.-S。 :描述符由inotify m_fd = inotify_init();
答案 0 :(得分:8)
您错误地确定了问题。
const int nbDescriptors = poll(&descriptors, m_fd+1, 10*1000);
这是错误的,因为poll
的第一个参数是(指向一个)数组,第二个参数是该数组中元素的数量。
结果,系统调用正在读取数组的末尾。通过声明它static
你只是在记忆中移动了东西并且很幸运。
你需要:
const int nbDescriptors = poll(&descriptors, 1, 10*1000);