2012-02-23 1 views
3

나는 내 작은 프로젝트에 대한 설문 조사() 함수를 탐험하고있어, 나는이 조각 추락 것으로 나타났습니다 : 그것은 지적 때문에폴링이 주 파라미터를 호출 이상으로 사용해야하는 이유는 무엇입니까?

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();

답변

8

문제를 잘못 확인했습니다.

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

poll의 첫번째 인자는 배열 A (내지 An 포인터)이고, 두 번째 인수는 그 배열의 요소 수 있기 때문에이 문제가된다.

결과적으로 시스템 호출은 배열의 끝을지나 읽고 있습니다. 그것을 static이라고 선언함으로써 당신은 단지 주변의 것들을 기억 속에서 움직 였고 운이 좋았습니다.

당신이 필요합니다

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

오. 그 점을 지적 해 주셔서 감사합니다. 내가 읽고 있던 프랑스 맨 페이지가 두 번째 논점에 대해 혼란 스럽기 때문에 나는 select의 남자를 보러 거기에서 설명을 선택했다 : "nfds est le numero du와 grand descripteur de fichier des 3 앙상블 더하기 1. " 번역기를 찌를 것이므로 페이지를 업데이트 할 것입니다. – qdii