일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- level trigger
- ncurses
- 어셈블리어
- wrefresh
- ioctl
- rfc5508
- DOCKER-USER
- packet filter
- cbpf
- architecture
- packet flow
- epoll
- .nret core 배포
- REDIS
- epoll_wait
- iptables
- NAPT
- C언어
- BOF
- wnourefresh
- vtable
- .net core 7
- mvwin
- Compiler
- doupdate
- edge trigger
- 취약점
- 풀이
- LOB
- Docker
- Today
- Total
목록C++ (5)
Tuuna Computer Science
C++ vtable gdb로 살펴보기 개론 C++의 상속관계에서 다형성을 구현하기 위해서는 Virtual 함수를 사용하여 구현한다. 이를 gdb를 통해서 어떤식으로 구성하는지 알아보자. #include class A { public: virtual void a_func() { std::cout A *ptr = nullptr; 0x00000000004011b8 : mov QWORD PTR [rbp-0x8],0x0 => ptr = &a; 0x00000000004011c0 : lea rax,[rbp-0x18] 0x00000000004011c4 : mov QWORD PTR [rbp-0x8],rax 그리고 parent()함수를 호출하는 어셈블리 코드인데 좀 더 세부적으로 분해를 해보자. => ptr->parent..
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를통해 즉시가 아닌 준비작업을 마치고 ..
C++ Async Logging Logging을 해보자! 일반적인 소프트웨어 경우 Logging은 필수다. 그렇기 어떻게 Logging을 할 수 있고 어떤식으로 Logging을 구현하는 것이 효율적인것인가에 대해 알아볼것이다. Logging의 중요성 : 인터넷에 검색해보면 자세히 나온다. 일반적인 IO의 문제점 Logging을 하기위해 가장 많이 쓰이면서 간단한 방법은 Synchronous하게 IO를 작동시키는것이다. 즉, 코드실행중간에 Logging 코드를 실행하여 File에 Write또는 Read하는 것이다. 아래 코드를 살펴보자 #include #include class Logging{ private: std::ofstream file; void writeFile(std::string msg){ f..