/dev/hda를 raw io 하려는데, invalid argument 에러가 납니다
글쓴이: jai / 작성시간: 월, 2004/11/08 - 11:09오전
저는 파티션 한 개를 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
Forums:
저는 초보라서 사실 이 문제에 대해 전혀 모르지만, 혹시나 싶어서 적어
저는 초보라서 사실 이 문제에 대해 전혀 모르지만, 혹시나 싶어서 적어 봅니다.
제가 맞게 짐작하고 있는 것인지 모르겠지만, 혹시 /dev/hda가 블럭 장치라서 안되는 것이 아닐까요..? ^^;
raw 명령 맨페이지를 보면 된다고 그랬거든요 --a
블럭 디바이스와 바인드된 raw 디바이스는 열고 읽고 씌여질 수 있다. 바운드된 블럭 디바이스처럼..
이말을 open("/dev/raw8"), write, read 할 수 있다고 해석한건데요..--a
다른 의미인건가요?
peace :)
너무 늦은 답변이지만..
raw I/O를 사용하려면, char buf[4096]; 대신 block device의 sector크기(대부분 512)로 정렬된 메모리를 buffer로 넘기셔야 합니다.
즉 아래 코드에서 buf대신 512 byte로 정렬된 메모리 포인터를 넣어주면 정상 동작할 것입니다.
i = write(fd, buf, 4096);
--------------------------------------------------------------------------------------
조금씩이라도 전진한다.
댓글 달기