일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- kevent
- 레지스터
- Assembly
- 터미널 커서
- 터미널 제어
- MAN
- termios
- 명령어
- getch
- 커서 제어
- 서버 프로그래밍
- cursor
- 가상 상속
- termcap
- 가상상속
- virtual 상속
- opcode
- 어셈블리어
- multiplexing
- 클래스 상속
- canonical
- UNIX
- 터미널제어
- pipe buffer
- IPC
- 멀티플렉싱
- kqueue
- nonblock
- lseek
- 프롬프트
- Today
- Total
목록UNIX (5)
오늘도 밤이야
*오역이 많을 수 있습니다. 직역과 의역을 섞어 번역되어 있어, 영문 문서를 기본으로 하되 참고하는 정도로 봐주시면 감사하겠습니다.* man page 참조 환경: macOS Big Sur 11.4 Apple clang version 12.0.5 (clang-1205.0.22.11) Target: x86_64-apple-darwin20.5.0 Thread model: posix KQUEUE(2) BSD System Calls Manual KQUEUE(2) NAME kqueue, kevent, kevent64 and kevent_qos -- 커널 이벤트 발생 알림 매커니즘 LIBRARY Standard C Library (libc, -lc) SYNOPSIS #include #include #include i..
kqueue는 BSD 계열에서 지원하는 Event 관리 system call로, Linux 계열에서 select를 개선한 epoll과 비슷하게 사용되고 동작한다. 여러 fd를 모니터링하고, fd에 대한 동작(read, write)이 준비되었는지 알아내는데 사용되어 I/O Multiplexing을 이용하는 서버 프로그램을 작성하는데 사용된다. 0. Concept kqueue는 커널에 할당된 폴링 공간(kernel event queue - kqueue)에 모니터링할 이벤트를 등록하고, 발생한 이벤트를 return받아 Multiple I/O Event를 처리할 수 있도록 도와준다. 이벤트 등록 및 반환은 kevent 구조체를 통해 이루어지며, 구조체 필드로 존재하는 이벤트에 대한 필터, 플래그 등을 이용해 다..
UNIX 환경에서의 대표적인 IPC(프로세스간 통신) 방법 중 하나인 pipe의 특징에 대해서 알아보자. pipe는 단방향으로만 데이터를 전달할 수 있다 pipe는 커널 메모리를 파일로써 접근할 수 있게 해주어, pipe() 사용시 배열로 두 개의 file descriptor를 발급받는다. fd[0]은 input stream, fd[1]은 output stream으로, 부모 프로세스가 fd[1]에 write한 데이터를 자식 프로세스가 fd[0]으로 read 할 수 있다. 이때 반대의 경우는 사용이 불가능하다. 부모 프로세스가 write, 자식 프로세스가 read하는 상황에서 그 pipe를 유지한 채 자식프로세스가 fd[1]에 write할 수 없다. 이런 사용을 막기 위해 pipe 사용 시 각 프로세스에서..
프롬프트 환경을 만들게 되면 입력 내용을 수정 및 편집하기 위해 커서를 옮겨주어야 한다. 그러나 기본 설정의 터미널에서 커서를 옮기기 위해 방향키(화살표 키)를 누르면 커서는 옮겨지지 않고 다음과 같은 이상한 문자가 입력된다... 방향키로 커서를 제어하기 위해서는 터미널 옵션을 바꾸고, 키보드 입력이 있을 때마다 커서를 한땀한땀 바꿔주어야 한다. 먼저 기본 환경 설정이다. getch()처럼 한 글자씩 입력받기 위한 설정과 같다. [터미널 제어를 통해 한 글자씩 입력 받는 getch() 만들기] hyeonski.tistory.com/5 [C/UNIX] 개행 없이 한 글자씩 입력받는 getch() 만들기 (터미널 제어) 프롬프트 또는 콘솔 환경을 만들기 위해서 키보드 입력을 한 자씩 받아야할 때가 있다. u..
프롬프트 또는 콘솔 환경을 만들기 위해서 키보드 입력을 한 자씩 받아야할 때가 있다. unistd.h의 read함수를 STDIN에서 1바이트만큼 받으면 되지 않을까? 해서 다음과 같은 코드를 실행해보았다. #include #include int main(void) { char c; while (read(0, &c, sizeof(c)) > 0) { printf("input: %c\n", c); } } read는 분명 1byte씩 잘 읽고 있다. 그렇다면 왜 return이 입력되기 전에는 계속 입력만 받고 있을까? 이는 터미널의 canonical input 설정 때문이다. 한 line(line의 기준은 '\n'이다) 단위로 읽기 때문에 read()가 몇 byte로 읽든 newline이 입력되기 전까지 실시간..