2017-03-28 4 views
0

다음 코드에 문제가 있습니다. 그것은 나에게 나쁜 파일 기술자 오류를주고있다. 디버깅시이 코드가 잘못된 파일 설명자를 제공하는 이유

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <errno.h> 
#include <limits.h> 
int main() 
{ 
     int fd = open("/tmp/test", O_RDONLY); 
     long len = 20; 
     long word; 
     ssize_t ret; 
     if(fd == -1) 
     { 
       perror("open"); 
       return 1; 
     } 
     if(len > SSIZE_MAX) 
     { 
       len = SSIZE_MAX; 
     } 
     ret = read(fd, &word, len); 
     while(len != 0 && ret != 0) 
     { 
       if(ret == -1) 
       { 
         if(errno == EINTR) 
         { 
           continue; 
         } 
         perror("read"); 
         break; 
       } 
       len -= ret; 
       word += ret; 
       ret = read(fd, &word, len); 
     } 
     close(fd); 
} 

I는 첫번째 반복 이후 fd의 값이 다수로 변경되는 것을 발견 하였다. 나는 이것이 어떻게 일어나고 있는지 모른다. 당신이 필요한 것보다 훨씬 적은 sizeof(long) 위해 지정된 메모리에 20 바이트를 읽기 위해 노력하고 귀하의 코드에서

+1

당신은'4 또는 8 바이트 공간이 1'long',에 20' 바이트를 읽을 수있을 것이다. – mch

+0

네, 시간 내 주셔서 감사합니다. – ahmedrajput

+0

스택 오버플로에 오신 것을 환영합니다. 여기서 '감사합니다'라고 말하면 가장 좋은 방법은 위의 좋은 질문과 유용한 답변 (충분한 답변을 얻으려면 명을 얻은 것임)이며, 질문에 대한 가장 유용한 답변을 수락하면됩니다. (이는 또한 평판에 대한 귀하의 에 약간의 도움이됩니다). [정보] 페이지 및 [질문은 어떻게합니까? 여기에 있습니까?] (http://stackoverflow.com/help/how-to-ask) 및 [내 질문에 대한 대답은 무엇을해야합니까? ?] (http://stackoverflow.com/help/someone-answers) –

답변

1

ret = read(fd, &word, len); 

undefined behavior됩니다. 이 글을 쓰는의

한 올바른 방법은

ret = read(fd, &word, sizeof(word)); 
+0

감사 Sourav, 당신은 영웅입니다. – ahmedrajput

+0

그리고 미안 해요 나는 대답을 upvote하기에 충분한 명성이 없습니다. 나는 초보자입니다. – ahmedrajput

+0

반갑습니다. @ hmedrajput 문제를 해결하는 데 도움이된다면 [도움이 된 대답 수락을 고려해보십시오.] (http://meta.stackexchange.com/q/5234/244062). 어쨌든, upvotes 걱정하지 마십시오. –

관련 문제