컴퓨터 공부/Advanced UNIX System Programming

[5월 8일 2교시] 입출력

려리군 2009. 5. 8. 11:20

비동기 입출력

입출력 가능시 시그널 발생

 - BSD계열 : SIGIO, SIGURG

 - SysV계열 : SIGPOLL


static void signal_io(int signo)

{

....

if ((n = read(fd, buf, sizeof(buf))) < 0)

err_sys(“read error”);

/* 입력 데이터 처리 */

}


int main(void) {

....

if (signal(SIGIO, signal_io) < 0) /* 시그널 핸들러 설정 */

err_sys(“signal error”);


if (fcntl(fd, F_SETOWN, getpid()) < 0) /* 시그널 수신자 설정 */

err_sys(“fcntl F_SETOWN error”);


if ((val = fcntl(fd, GETFL, 0)) < 0)

err_sys(“fcntl F_GETFL error”);

val |= O_ASYNC;

if (fcntl(fd, F_SETFL, val) < 0) /* 비동기 입출력 설정 */

err_sys(“fcntl F_SETFL error”);


/* 입출력 작업 외에 다른 작업 수행 */

exit(0);

}


memory mapped I/O

메모리 접근만으로도 파일 입출력 가능.


#include<sys/types.h>

#include<sys/mmap.h>

caddr_t mmap(caddr_t addr, size_t len, int prot, int flag, int filedes, off_t off);

리턴 - 할당된 시작 가상 주소. 실패시 -1

addr - 맵핑할 가상 주소 시작(NULL이면 커널이 mapping)

len - 맵핑할 크기

prot - protection설정 플래그, PROT_READ, PROT_WRITE, PROT_EXEC, PROT_NONE

flag - MAP_FIXED, MAP_SHARED, MAP_PRIVATE

filedes - 파일 디스크립터

off - 파일의 쓰고자 하는 시작 offset

int munmap(caddr_r addr, size_t len);

리턴 - 성공시 0, 실패시 -1

addr - 맵핑할 가상 주소 시작(NULL이면 커널이 mapping)

len - 맵핑할 크기