linux ] O_DIRECT를 이용한 write / read 질문있습니다.
글쓴이: erin / 작성시간: 월, 2011/02/14 - 4:45오후
O_DIRECT 때문에 골치아픈 1인입니다.
O_DIRECT를 하여 open을 해서 읽고 쓰고 싶은데 잘 안되고 있습니다.
찾아보니 posix_memalign(소스 104줄)을 이용하라기에 그것도 적용해보았습니다.
아래 저의 소스에서 lseek(소스 119줄)에서부터 Illigal seek 에러가 나고 있습니다.
문론 memcpy도 Illigal seek 에러가 나요.
posix_memalign에서 부터 잘못된 것일까요?
posix_memalign에서 2,3번째 아규먼트도 저렇게 잡는게 맞는 것인가요?
도와주세요~
88 void main(void){ 89 90 char szFilename[]={"SMART.txt\0\0"}; 91 unsigned char abPacket[]={0x2A, 0x53,0x43,0x5F,0x49,0x4F,0x5F}; 93 int hDevice=0, a, b; 94 unsigned char *buf= NULL; 95 96 //buf = memalign(getpagesize(), getpagesize()); 97 //buf=(char*)valloc(4096); 98 //b= posix_memalign(&buf, getpagesize(), getpagesize()); 99 //printf("buf: %08x\n", b); 100 //perror("posiz_memalign error"); 101 //buf = malloc(strlen(abPacket)+getpagesize()); 102 //buf = buf&~0xFFF; 103 104 posix_memalign((void**)&buf, getpagesize(), getpagesize()); 105 106 if(buf == NULL) { 107 printf("malloc error\n"); 108 perror("posix_memalign error"); 109 return; 110 } 111 112 hDevice = open(szFilename, O_RDWR|O_DIRECT|O_CREAT|O_TRUNC, S_IRWXU); 113 perror("open error"); 114 if (hDevice <0){ 115 printf("open error\n"); 116 return; 117 } 118 119 lseek(hDevice, getpagesize(), 0); 120 perror("lseek error"); 121 memcpy(buf, abPacket, sizeof(abPacket)); 122 perror("memcpy error"); 123 printf("buf:%s\n",buf); 124 //a = write(hDevice, buf, sizeof(abPacket)+getpagesize()); 125 a = write(hDevice, buf, getpagesize()); 126 if(a<0) { 127 // printf("write error: %08x\n", a); 128 close(hDevice); 129 free(buf); 130 remove(szFilename); 131 perror("write error"); 132 return; 133 } ...
Forums:
errno 의 값은 이전에 호출된 것이 실패했을 때만
errno 의 값은 이전에 호출된 것이 실패했을 때만 의미있습니다.
성공했을 때 0 으로 리셋되지 않습니다.
그리고, 모든 함수가 errno 를 사용해서 에러리턴을 하지도 않습니다.
그러니 perror() 를 남발하지마세요.
댓글 달기