欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++實現reactor高并發(fā)服務器的詳細教程

 更新時間:2024年03月12日 09:13:48   作者:__Zed  
這篇文章主要介紹了c++從零實現reactor高并發(fā)服務器,包括環(huán)境準備和基礎知識介紹,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

環(huán)境準備

  • linux虛擬機
  • 安裝升級c/c++編譯器
  • gcc/g++ 選項 源代碼文件1 源代碼文件2 ... 源代碼文件n
  • -o指定輸出的文件名(不能和源文件同名 默認是a.out)
  • -g調試 -On鏈接時優(yōu)化 減小體積(n=1-3) -c只編譯 用于生成庫
  • -std=c++11 支持c++11標準
  • 安裝man功能
  • man 級別 接口/命令
  • 級別: 1系統命令 2系統接口 3庫函數 4設備文件 5文件 9內核
  • 安裝vscode c/c++插件 簡體中文插件 Remote-ssh插件

基礎知識

靜態(tài)庫動態(tài)庫

  • g++ -c -o libxxx.a xxx.cpp 生成了libxxx.a的靜態(tài)庫
  • g++ -o demo demo.cpp -L/path/xxx -lxxx -L指定路徑 -l指定靜態(tài)庫名
  • 用靜態(tài)庫和用源代碼是一樣的,好處是可以隱藏源代碼
  • g++ -fPIC -shared -o libxxx.so xxx.cpp 制作動態(tài)庫 調用方式同上
  • 用動態(tài)庫必須先把目錄加到LD_LIBRARY_PATH
  • 動態(tài)庫是編譯時不會連接到程序中,而是運行時裝入,如果多個程序用到同一靜態(tài)庫,只在內存有一份(代碼共享),避免空間浪費

**靜態(tài)動態(tài)庫都有 優(yōu)先使用動態(tài)

makefile

每次編譯都要g++ xxxx很麻煩,果然懶惰是第一生產力

highlighter- livecodeserver

# 指定編譯的目標文件是生成這倆庫
all:libxxx.a \
    libxxx.so
# 編譯libxxx.a時,如果發(fā)現后面這倆文件變化了 重新編譯
libxxx.a: main.h main.cpp
	g++ -c -o libxxx.a main.cpp+
# 同上
libxxx.so: main.h main.cpp
	g++ -fPIC -shared -o libxxx.so main.cpp
# make clean命令
clean:
		rm -f libxxx.a libxxx.so
  • 增量編譯,也就是說當前目錄下有靜態(tài)/動態(tài)了,就不編譯這個了
  • 用-I指定頭文件包含路徑
  • g++前面是個tab,而不是八個空格
  • main函數第三個是char* envp[] 打印出來效果如同env命令
  • int setenv(const char* name, const char* value, int override) 環(huán)境變量名/值/是否替換 返回0成功-1失敗(幾乎不失敗) 只對當前進程生效 進程終止下次就沒有了,對shell無效

gdb調試

  • yum -y install gdb 安裝
  • 編譯時加-g 不要加-On
  • gdb常用命令
  • set args xx xx xx 設置參數
  • break/b xx 在第某行打斷點 (ctrl+g顯示行號 或者vi下:set number)
  • run/r 一直運行直到斷點
指令用處其他說明
set args xx xx設置參數
break/b 20在第20行打斷點ctrl+g 或 :set number
run/r從頭一直運行直到斷點
next/n執(zhí)行當前語句若為函數調用不進入
step/s執(zhí)行當前語句進入(庫函數由于無源碼進不去)
continue/c運行到下一個斷點
print/p xx查看變量/表達式的值甚至可以p strlen(xx) p xx = 1
set var xx = xx調試時設置參數
quit/q退出gdb
  • 出現段錯誤時(操作空指針) 程序會被內核強行終止,保存在core文件中(需要先ulimit -a 查看 core file size ulimit -c unlimited更改后才能看到)
  • gdb demo core.123調試core文件 bt查看函數調用棧
  • ps -ef|grep demo 查看進程號 gdb -p demo 123 會自動停止

linux

時間 <time.h>

  • time_t
    typedef long time_t
  • 獲取1970/1/1到現在的秒數
    time_t now = time(0)time_t now; time(&now)

tm結構體

從time_t轉tm結構體,注意加_r 線程安全
localtime_r(&now, &tmnow)

  • mktime(&tm)把結構體轉time_t

gettimeofday(struct timeinterval* tv, struct timezone* tz) 獲取1970/1/1到現在的秒數+當前的微秒數

  • sleep(秒) usleep(微秒)

目錄操作<unistd.h>

  • 獲取當前目錄
    char* getcwd(char* buf, size_t size)char* get_current_dir_name()
  • 相當于pwd,目錄最大長度255 getcwd需要初始化一個256長度的字符數組,get_current_dir_name需要接free
  • 切換目錄
    int chdir(const char*path)

  • 創(chuàng)建目錄
    int mkdir(const char*pathname, mode_t mode)

  • mode如0755,不要省略0
  • 刪除目錄
    int rmdir(const char*path)

<dirent.h> 讀取目錄相當于ls -a

highlighter- cpp

DIR* opendir(const char* path); //打開目錄
struct dirent*readdir(DIR* dirp); //讀取目錄
int closedir(DIR* dirp);        //關閉目錄

  • 其中 d_type = 8 是文件,= 4 是子目錄
    a
  • 判斷文件是否有某個權限,有返回0 沒有返回-1
    int access(const char* path, int mode)

stat結構體,有很多成員,比ls列出的還多
int stat(const char*path, struct stat*buf)

  • 修改目錄或文件的時間
    int utime(const char* path,const struct utimbuf* time)

  • rename庫函數 相當于mv
    int rename(const char* old, const char* new)

  • remove庫函數 相當于rm
    int remove(const char* path)

Linux系統錯誤 <errno.h>

  • 獲取錯誤代碼的詳細信息
    char* strerror(int errnum)int strerror_r(int errnum, char* buf, size_t buflen)

  • 控制臺顯示最近一次系統錯誤的詳細信息
    void perrpr(const char*s)

  • 不是系統調用的函數,不會設置errorno?。。?!
  • 相當于出現error時,printf打印一下,但是error不會自動清零,所以一般是判斷if (ret!=0) 也就是執(zhí)行失敗再去看錯誤

linux信號

可以用默認的信號操作(通常會終止進程) 也可以用signal函數自定義處理方式,但是有的信號不可被捕獲、忽略 如9

sighandler_t signal(int signum, sighandler_t func)void (*sighandler_t)(int);

  • 說明信號處理函數返回值void 入參int
  • func傳入 SIG_IGN 表示忽略這個值的信號 SIG_DFL表示恢復默認
  • alarm(5); signal(14,func); 用于定時五秒發(fā)送鬧鐘信號(14)然后執(zhí)行func函數~~ 注意 func中需要有alarm(5) 不然就只會處理一次咯??!

進程終止

  • main函數中,return返回
  • 任意函數調用exit, _exit() , Exit()
  • exit()不會調用局部變量的析構,但是會調用全局變量的析構
  • _exit() 和 Exit() 直接退出,不會進行任何操作
  • 退出線程:pthread_exit() 線程主函數return

  • abort()異常終止、接收到信號、最后一個線程對取消請求做出響應

終止的狀態(tài)就是main中 return 幾

  • exit(5) 可以把狀態(tài)變成5 退出后,用echo $?查看

參考資料

到此這篇關于c++從零實現reactor高并發(fā)服務器的文章就介紹到這了,更多相關c++ reactor高并發(fā)服務器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解C++編程中數組的基本用法

    詳解C++編程中數組的基本用法

    這篇文章主要介紹了C++編程中數組的基本用法,包括數組的初始化等基本知識,需要的朋友可以參考下
    2016-01-01
  • C語言歷史與演化—C89、C99、C11、C17、C2x

    C語言歷史與演化—C89、C99、C11、C17、C2x

    C語言作為一門古老而受歡迎的編程語言,經歷了多個版本的演進和標準化,本文將深入解析C語言的四套標準,即C89、C99、C11和C17,通過具體實例說明每個標準引入的新特性和改進
    2024-11-11
  • C語言?超詳細梳理總結動態(tài)內存管理

    C語言?超詳細梳理總結動態(tài)內存管理

    動態(tài)內存是相對靜態(tài)內存而言的。所謂動態(tài)和靜態(tài)就是指內存的分配方式。動態(tài)內存是指在堆上分配的內存,而靜態(tài)內存是指在棧上分配的內存,本文帶你深入探究C語言中動態(tài)內存的管理
    2022-03-03
  • C語言中無符號數和有符號數之間的運算

    C語言中無符號數和有符號數之間的運算

    C語言中有符號數和無符號數進行運算默認會將有符號數看成無符號數進行運算,其中算術運算默認返回無符號數,邏輯運算當然是返回0或1了。下面通過一個例子給大家分享C語言中無符號數和有符號數之間的運算,一起看看吧
    2017-09-09
  • Qt實現密碼顯示按鈕

    Qt實現密碼顯示按鈕

    這篇文章主要為大家詳細介紹了Qt實現密碼顯示按鈕,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言結構體嵌套與對齊超詳細講解

    C語言結構體嵌套與對齊超詳細講解

    這篇文章主要介紹了C語言結構體嵌套與對齊,C語言中結構體是一種構造類型,和數組、基本數據類型一樣,可以定義指向該種類型的指針。結構體指針的定義類似其他基本數據類型的定義
    2022-12-12
  • c++11中regex正則表達式示例簡述

    c++11中regex正則表達式示例簡述

    這篇文章主要給大家介紹了關于c++11中regex正則表達式的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用c++11具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-11-11
  • C語言數據結構之判斷循環(huán)鏈表空與滿

    C語言數據結構之判斷循環(huán)鏈表空與滿

    這篇文章主要介紹了C語言數據結構之判斷循環(huán)鏈表空與滿的相關資料,希望通過本文能幫助到大家,讓大家掌握這部分內容,需要的朋友可以參考下
    2017-10-10
  • C語言實現成績統計示例

    C語言實現成績統計示例

    這篇文章主要介紹了C語言實現成績統計示例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 利用C++實現一個線程安全的map

    利用C++實現一個線程安全的map

    這篇文章主要為大家詳細介紹了如何利用C++實現一個線程安全的map(使用ChatCPT生成),代碼是通過兩輪對話完善的,感興趣的小伙伴可以了解一下
    2023-05-05

最新評論