나는 내 작은 프로젝트에 대한 설문 조사() 함수를 탐험하고있어, 나는이 조각 추락 것으로 나타났습니다 : 그것은 지적 때문에폴링이 주 파라미터를 호출 이상으로 사용해야하는 이유는 무엇입니까?
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
: descriptors
으로
==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
에 대한 포인터는 더 이상 유효하지 않을 때. 이 포인터는 함수가 반환 된 후에 사용할 수 있다고 생각했습니다. 이를 확인하기 위해 설명자를 선언하는 행을 static struct pollfd descriptors = { m_fd, IN_MODIFY, 0 };
으로 변경했으며 충돌이 사라졌습니다.
왜 설명자가 poll() 호출보다 오래 있어야합니까? (또는 내가 잘못한 것이 있습니까?)
P.-S. : 설명자가 inotify로 채웠습니다. m_fd = inotify_init();
오. 그 점을 지적 해 주셔서 감사합니다. 내가 읽고 있던 프랑스 맨 페이지가 두 번째 논점에 대해 혼란 스럽기 때문에 나는 select의 남자를 보러 거기에서 설명을 선택했다 : "nfds est le numero du와 grand descripteur de fichier des 3 앙상블 더하기 1. " 번역기를 찌를 것이므로 페이지를 업데이트 할 것입니다. – qdii