기본 색인 | 섹션 9 | English | 日本語 | 옵션 |
#include <sys/types.h>
#include <sys/uio.h>
struct uio { struct iovec *uio_iov; int uio_iovcnt; off_t uio_offset; int uio_resid; enum uio_seg uio_segflg; enum uio_rw uio_rw; struct proc *uio_procp; };
캐릭터형 디바이스의 드라이버에게 건네진, 모든 read(2), write(2), readv(2) 없고 writev(2) 시스템 콜의 결과로서, 적절한 드라이버의 d_read 또는 d_write 엔트리가 struct uio 구조체의 포인터를 건네받아 불려 갑니다. 전송의 리퀘스트는, 이 구조체안에 encode 됩니다. 드라이버 자신도 이 구조체안의 데이타를 뽑기 시작하기 위해서(때문에) uiomove() (을)를 사용해야 합니다.
uio 구조체의 각 필드는 아래와 같은 대로입니다.
uio_iov | |
처리해야 할 입출력 벡터의 배열입니다. 산재적인 입출력의 경우에는, 하나 이상의 벡터가 되겠지요. | |
uio_iovcnt | |
존재하고 있는 입출력 벡터의 수를 나타냅니다. | |
uio_offset | |
디바이스의 오프셋(offset)입니다. | |
uio_resid | |
처리해야 할 바이트수입니다. | |
uio_segflg | |
이하의 플래그안의 하나입니다. | |
UIO_USERSPACE | |
입출력 벡터는 프로세스의 address 공간을 가리키고 있습니다. | |
UIO_SYSSPACE | |
입출력 벡터는 커널의 address 공간을 가리키고 있습니다. | |
UIO_USERISPACE | |
입출력 벡터는 프로세스의 address 공간의 인스트럭션 area를 가리키고 있습니다. | |
UIO_NOCOPY | |
오브젝트중에 이미 데이터가 있어, 카피하지 않습니다. | |
uio_rw | |
요구된 전송의 방향을 나타내, UIO_READ 또는 UIO_WRITE 입니다. | |
uio_procp | |
thread에 관련지을 수 있었다 struct thread 구조체에의 포인터입니다. uio_segflg 하지만 프로세스의 address 공간과의 전송을 해야 한다라고 가리키고 있는 경우에 사용됩니다. | |
/* MIN()의 정의는 이 안에 있습니다 */ #include <sys/param.h>#define BUFSIZE 512 static char buffer[BUFSIZE];
static int data_available; /* 읽어들일 수 있는 데이터량 */
static int fooread(dev_t dev, struct uio *uio, int flag) { int rv, amnt;
while (uio->uio_resid > 0) { if (data_available > 0) { amnt = MIN(uio->uio_resid, data_available); if ((rv = uiomove((caddr_t) buffer, amnt, uio)) ! = 0) goto error; data_available -= amnt; } else { tsleep(...); /* 보다 좋은 시기까지 기다린다 */ } } return 0; error: /* 에러의 클린 업을 여기서 행한다 */ return rv; }
UIO (9) | February 2, 1997 |
기본 색인 | 섹션 9 | English | 日本語 | 옵션 |
Ben Bullock이 유닉스 매뉴얼 페이지에서 서비스에 대한 의견을 주시기 바랍니다. Privacy policy.
“ | Did you know that 7/5 people don't know how to use fractions? | ” |