linux ] O_DIRECT를 이용한 write / read 질문있습니다.

erin의 이미지

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         }
 
...
bushi의 이미지

errno 의 값은 이전에 호출된 것이 실패했을 때만 의미있습니다.
성공했을 때 0 으로 리셋되지 않습니다.
그리고, 모든 함수가 errno 를 사용해서 에러리턴을 하지도 않습니다.
그러니 perror() 를 남발하지마세요.

댓글 첨부 파일: 
첨부파일 크기
Plain text icon trunc.c.txt2.25 KB

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.