为什么民意调查要求其主要参数超出通话范围?

时间:2012-02-23 23:24:59

标签: c posix inotify

我在我的一个小项目上探索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();

填充

1 个答案:

答案 0 :(得分:8)

您错误地确定了问题。

const int nbDescriptors = poll(&descriptors, m_fd+1, 10*1000);

这是错误的,因为poll的第一个参数是(指向一个)数组,第二个参数是该数组中元素的数量。

结果,系统调用正在读取数组的末尾。通过声明它static你只是在记忆中移动了东西并且很幸运。

你需要:

const int nbDescriptors = poll(&descriptors, 1, 10*1000);