일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- cbpf
- mvwin
- rfc5508
- packet flow
- NAPT
- DOCKER-USER
- edge trigger
- wnourefresh
- ncurses
- doupdate
- packet filter
- epoll
- .net core 7
- C언어
- .nret core 배포
- epoll_wait
- architecture
- 취약점
- Compiler
- ioctl
- 어셈블리어
- iptables
- level trigger
- REDIS
- wrefresh
- Docker
- 풀이
- vtable
- BOF
- LOB
- Today
- Total
Tuuna Computer Science

ncurses를 사용하다보면 창을 수정하고 실제 터미널로 출력하기를 원할 때 refresh(), wrefresh(WINDOW* win)을 사용하는 경우가 많다. 그렇다면 새로고침할 때 사용하는 wrefresh()함수는 내부적으로 어떻게 이루어져 있을까 코드를 보면 wrefresh()함수는 내부적으로 wnourefresh()함수를 호출하고 doupdate()함수를 호출한다. wnourefresh()함수는 수정한 내용을 가상터미널로 출력하는 역할을 지닌 함수이고 doupdate()함수는 가상터미널에 있는 출력문을 실제 터미널로 비교 출력하는 역할을 지닌다. 즉, wrefresh()함수는 wnourefresh()->doupdate()함수의 반복적 사용이라고 볼 수 있다. 하지만 터미널 사이의 출력은 꽤나 큰 ..

Ncurses 내에서 윈도우를 옮겨야 할때 mvwin()이라는 함수가 존재한다. 일반적인 window를 mvwin()하면 해당 윈도우의 _begy와 _begx에 인자로 주어진 by와 bx를 대입하고 touchwin()으로 윈도우 자체를 새로 그린다음 wrefresh()를 호출하면 된다. 하지만 subwindow의 경우 말이 많이 달라진다. 코드로 살펴보자 위는 ncurses내의 mvwin()을 하는 코드이다. mvwin()함수 내부를 보면 해당 인자로 주어진 win이 subwin 플래그가 있는지 확인한다. 없을 시 바로 위에서 언급한대로 옮기기를 시도한다. 하지만 _SUBWIN 플래그가 존재할 시 특별한 루틴을 타는데 바로 dupwin()함수를 통해 기존의 win을 복제한 다음 기존의 win의 내용을 지..
Edge Trigger vs Level Trigger 예전에 공부할땐 이 둘이 뭔 차이인지도 몰랐고 어떤 상황에서 쓰이는가에 대한 생각조차 하지 않았지만 최근 채팅 서버를 epoll과 thread를 사용해서 구현하는 과정에서 클라이언트의 EPOLLIN 이벤트에 맞서서 큐에 넣고 thread가 처리하기를 원했다. 하지만 thread에 값을 넣고 thread가 처리하기 까지 계속해서 EVENT통지를 해서 문제가 생겼다. 이게 바로 Level Trigger이다. 즉, 데이터가(이벤트가)존재한다면 계속해서 알림을 보내는것이다. 이것에 반하여 Edge Trigger는 이벤트가 발생하는(EPOLLIN)즉시에만 알림을 보내고 그 뒤로는 보내지 않는다. 이로서 차근차근 thread를통해 즉시가 아닌 준비작업을 마치고 ..