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() 를 남발하지마세요.
댓글 달기