비동기 입출력
입출력 가능시 시그널 발생
- 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 - 맵핑할 크기
'컴퓨터 공부 > Advanced UNIX System Programming' 카테고리의 다른 글
[5월 11일 1교시] FIFO (0) | 2009.05.11 |
---|---|
[5월 8일 3교시] IPC (0) | 2009.05.08 |
[5월 8일 1교시] 입출력 다중화 1 (0) | 2009.05.08 |
[5월 7일 3교시] 시그널 2 (0) | 2009.05.07 |
[5월 7일 2교시] 시그널 1 (0) | 2009.05.07 |