/dev/hda를 raw io 하려는데, invalid argument 에러가 납니다

jai의 이미지

저는 파티션 한 개를 raw io 하려고 합니다.

1. raw 명령으로 hda 와 raw 디바이스를 묶었어요.
man raw 에서는 바인드하고 나면, 캐릭터 디바이스파일을 블럭처럼 읽고 쓸 수 있다고 그랬는데요.

캐릭터 디바이스로 open, write call 하면 perror에는 Invalid argument 라고 찍히고, errno는 EPIPE 29 에러가 나요.
반면에 블럭디바이스로 open, write 하면 잘 되구요.

바인딩한 명령들이에요.
# ls -ald /dev/raw
drwxr-xr-x 2 root root 4096 12월 16 2003 /dev/raw

#ls -ald /dev/rawctl
crw-rw---- 1 root disk 162, 0 4월 11 2002 /dev/rawctl

#raw /dev/raw/raw8 /dev/hda8
# raw -qa
/dev/raw/raw8: bound to major 3, minor 8

2. 코드요.

 
#define PATHNAME "/dev/raw/raw8"

int main(int argc, char *argv[])
{
    int fd = 0, i = 0;
    char buf[4096];

    fd = open(PATHNAME, O_WRONLY);
    if (fd == -1) {
        perror("can't open");
        printf("errno %d\n file %s", errno, PATHNAME);
        return -1;
    }
    
    i = 0;  
    while (i < 4096) 
        buf[i++] = 'a';

    errno = 0;
    i = lseek(fd, 4096, SEEK_SET);
    if (i == -1) {
        perror("can't lseek");
        printf("fd %d errno %d\n", fd, errno); 
        return -1;
    }
    printf("lseek: offset %d fd %d\n", i, fd); 

    errno = 0;
    i = write(fd, buf,  4096);  
    if (i == -1) {
        perror("can't write string");
        printf("fd %d errno %d\n", fd, errno); ==> 요기서 에러!
        return -1;
    }
    printf("write: nbytes %d fd %d\n", i, fd); 

    close(fd);

    return 0;
}

3. 에러요
lseek: offset 4096 fd 3
can't write string: Invalid argument

익명 사용자의 이미지

저는 초보라서 사실 이 문제에 대해 전혀 모르지만, 혹시나 싶어서 적어 봅니다.

제가 맞게 짐작하고 있는 것인지 모르겠지만, 혹시 /dev/hda가 블럭 장치라서 안되는 것이 아닐까요..? ^^;

jai의 이미지

Quote:

#man raw
Once bound to a block device, a raw device can be opened, read and written, just like the block device it is bound to.

블럭 디바이스와 바인드된 raw 디바이스는 열고 읽고 씌여질 수 있다. 바운드된 블럭 디바이스처럼..

이말을 open("/dev/raw8"), write, read 할 수 있다고 해석한건데요..--a
다른 의미인건가요?

peace :)

lugi의 이미지

raw I/O를 사용하려면, char buf[4096]; 대신 block device의 sector크기(대부분 512)로 정렬된 메모리를 buffer로 넘기셔야 합니다.
즉 아래 코드에서 buf대신 512 byte로 정렬된 메모리 포인터를 넣어주면 정상 동작할 것입니다.

i = write(fd, buf, 4096);

--------------------------------------------------------------------------------------
조금씩이라도 전진한다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.