• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-159  評論-223  文章-30  trackbacks-0
             
                 摘要:    接上篇初始化與創(chuàng)建,本篇闡述Socket操作和銷毀兩部分的實現(xiàn)。 Socket操作    系統(tǒng)調(diào)用read(v)、write(v)是用戶空間讀寫socket的一種方法,為了弄清楚它們是怎么通過VFS將請求轉(zhuǎn)發(fā)到特定協(xié)議的實現(xiàn),下面以read為例(write同理),并假定文件描述符對應(yīng)的是IPv4 TCP類型的socket...  閱讀全文
            posted @ 2015-05-03 16:55 春秋十二月 閱讀(5269) | 評論 (0)編輯 收藏
                 摘要: 引言    在Unix的世界里,萬物皆文件,通過虛擬文件系統(tǒng)VFS,程序可以用標(biāo)準(zhǔn)的Unix系統(tǒng)調(diào)用對不同的文件系統(tǒng),甚至不同介質(zhì)上的文件系統(tǒng)進行讀寫操作。對于網(wǎng)絡(luò)套接字socket也是如此,除了專屬的Berkeley Sockets API,還支持一些標(biāo)準(zhǔn)的文件IO系統(tǒng)調(diào)用如read(v)、write(v)和close等。那么為什么socket也支持文件IO系統(tǒng)調(diào)...  閱讀全文
            posted @ 2015-05-03 16:31 春秋十二月 閱讀(8637) | 評論 (0)編輯 收藏
                 摘要: 字符集合     依據(jù)RFC3986 2規(guī)范,HTTP URI中允許出現(xiàn)的US-ASCII字符的子集,可以分成保留、未保留及轉(zhuǎn)義這幾類,每類的全部字符列表如下       ● 保留:  : / ? # [ ] @ ! $ & '( ) * + ,; =共18個,一般...  閱讀全文
            posted @ 2015-02-10 18:40 春秋十二月 閱讀(4738) | 評論 (1)編輯 收藏
                 摘要: 腳本概述   nginx是一款著名的開源web服務(wù)器,為方便升級與恢復(fù),編寫了一個簡單的腳本,因為升級備份了可執(zhí)行文件和配置文件(后綴名為old),所以可用于恢復(fù)。當(dāng)升級時,若nginx正在運行,則不中斷服務(wù)進行平滑升級,否則直接拷貝覆蓋;當(dāng)恢復(fù)時,若nginx正在運行,則不中斷服務(wù)進行平滑恢復(fù),否則直接拷貝覆蓋。是否正在運行根據(jù)pid來判斷,而pid從pid文件讀取...  閱讀全文
            posted @ 2015-01-19 00:36 春秋十二月 閱讀(2049) | 評論 (0)編輯 收藏
                 摘要:    本文描述了一種簡單的跨平臺鎖框架的設(shè)計與實現(xiàn),該框架小巧實用、易于擴展,它的特點如下:      ● 實現(xiàn)了線程間互斥鎖      ● 實現(xiàn)優(yōu)化了單線程環(huán)境中的空鎖和空級別鎖      ● 支持編譯時或運行時選擇鎖   ...  閱讀全文
            posted @ 2014-12-28 23:38 春秋十二月 閱讀(2422) | 評論 (6)編輯 收藏
               眾所周知,TLS是指線程局部存儲,F(xiàn)IFO是Unix中的命名管道,可用于無關(guān)進程間的通信,而本文描述的TLS FIFO是指這樣一種機制:如果一個線程在每次IO操作時,若沒有連接,則先連接到FIFO服務(wù)端,再將連接關(guān)聯(lián)到這個線程的TLS中,這里的連接即創(chuàng)建并打開唯一的FIFO,之后的讀寫就在這個FIFO連接上進行;當(dāng)FIFO連接斷開時,在下次IO操作時會自動重連。這樣一來,用戶程序就只要調(diào)用相關(guān)的IO操作,而不必管理連接,極大地簡化了程序。使用FIFO通信前先要創(chuàng)建FIFO再打開它,其中創(chuàng)建是最重要的操作,結(jié)果有3種情況:成功、失敗和已存在。

            結(jié)構(gòu)定義
            typedef struct 
            {
                int fd;
                char *name;
            }ipc_fifo_t;
              fd存儲FIFO文件描述符,name存儲FIFO文件系統(tǒng)路徑名。

            接口函數(shù)
               創(chuàng)建FIFO
            ipc_fifo_t* ipc_fifo_make(const char *path,mode_t mode);
              path指定FIFO路徑,可以是絕對路徑或相對路徑,mode指定訪問權(quán)限,若成功則返回一個FIFO結(jié)構(gòu),否則為NULL;通常被ipc_fifo_open調(diào)用。
               
               打開FIFO
            int ipc_fifo_open(ipc_fifo_t **f,const char *path,int flag,mode_t mode);
              flag指定打開標(biāo)志,如果包含了O_CREAT標(biāo)志,那么調(diào)用ipc_fifo_make創(chuàng)建新的FIFO對象并在打開成功后替換*f,否則如果*f為空,就分配并初始化一個fifo結(jié)構(gòu);mode指定訪問權(quán)限,僅當(dāng)創(chuàng)建時生效。雖然f為輸入輸出參數(shù),但操作失敗時不會影響它,也就是說沒有副作用。

              ● 發(fā)送數(shù)據(jù)   
            ssize_t ipc_fifo_write(ipc_fifo_t *f,const void *data,size_t size);
              如果成功則返回已發(fā)送的字節(jié)數(shù),否則返回-1,errno表示出錯代碼。
               
              ● 接收數(shù)據(jù)
            ssize_t ipc_fifo_read(ipc_fifo_t *f,void *data,size_t size);
              如果成功則返回已發(fā)送的字節(jié)數(shù),否則返回-1,errno表示出錯代碼。

              ● 關(guān)閉FIFO
            void ipc_fifo_close(ipc_fifo_t *f);
              當(dāng)通信結(jié)束的時候,應(yīng)該調(diào)用此函數(shù)來關(guān)閉FIFO,它會先刪除FIFO文件和關(guān)閉文件描述符,最后釋放fifo結(jié)構(gòu)。

              ● 獲取TLS FIFO
            ipc_fifo_t* ipc_fifo_tls_get();
              該函數(shù)一般被發(fā)送數(shù)據(jù)接口調(diào)用,若成功則返回一個FIFO結(jié)構(gòu),否則為NULL;每個線程對應(yīng)一個FIFO對象,對于同一線程,獲取的是同一個FIFO對象,而后便可調(diào)用ipc_fifo_write來發(fā)送數(shù)據(jù)。

            工作流程
              創(chuàng)建FIFO
              適用于FIFO客戶端和服務(wù)端,但服務(wù)端由于要異步處理眾多FIFO客戶端,因此要注意以下2個問題,這也是使用FIFO技術(shù)通信的一些細節(jié)。
              1)必須以非阻塞讀寫方式打開知名FIFO,即以O(shè)_CREAT|O_RDWR|O_NONBLOCK標(biāo)志來調(diào)用ipc_fifo_open,這樣才不會阻塞等待某個客戶端以同步寫方式打開知名FIFO而返回,因為它使用O_RDWR標(biāo)志,這樣自己既讀又寫,加上O_NONBLOCK,就立即返回了。
              2)必須以非阻塞只讀方式打開對應(yīng)客戶端FIFO,即以O(shè)_RDONLY|O_NONBLOCK標(biāo)志調(diào)用ipc_fifo_open,這樣就不會阻塞接受客戶端建立連接而返回。

              建立FIFO連接
              適用于FIFO客戶端,被發(fā)送數(shù)據(jù)接口調(diào)用,考慮到服務(wù)端可能事先沒有打開知名FIFO來監(jiān)聽連接,所以這里先以異步方式寫打開知名FIFO如果成功則改以阻塞方式發(fā)送唯一路徑名到服務(wù)端,如果發(fā)送完全后,接著以同步方式寫打開唯一FIFO,這是為了等待服務(wù)端打開了對應(yīng)的唯一FIFO。

              發(fā)送數(shù)據(jù)

              適用于FIFO客戶端,當(dāng)TLS中沒有關(guān)聯(lián)對應(yīng)的FIFO時,則先調(diào)用fifo_tls_get進入建立FIFO連接流程,而后再發(fā)數(shù)據(jù)。
            posted @ 2014-12-01 00:13 春秋十二月 閱讀(1349) | 評論 (2)編輯 收藏
                 摘要:    Web服務(wù)器為了支持https訪問,通常會使用第三方庫openssl實現(xiàn),而且為了高性能采用異步事件驅(qū)動模型,因此連接套接字被設(shè)為非阻塞類型,本文在nginx ssl模塊的基礎(chǔ)上,簡化提取它的核心框架,使用面向?qū)ο蟮姆绞矫枋觯瑥奈帐帧⒆x寫和關(guān)閉3個方面進行了分析,由于這3個操作都是異步的,因此操作失敗后要調(diào)用SSL_get_error來獲取錯誤碼,有如下4種情況。 &n...  閱讀全文
            posted @ 2014-04-11 17:26 春秋十二月 閱讀(13958) | 評論 (0)編輯 收藏
            模板
                1. 空基類優(yōu)化
                2. 元編程技術(shù)
                    2.1. 選擇API
                    2.2. 計算最值
                    2.3. 類型選擇
                3. 封裝GCC原子操作
                4. 定制類對象的內(nèi)存管理

            算法
                1. 排序
                    1.1. 改進的快速排序
                    1.2. 原位統(tǒng)計排序     
                2. 多叉樹
                    2.1. 深度優(yōu)先存儲
                    2.2. 迭代器的設(shè)計
                    2.3. 前序遍歷
                    2.4. 后序遍歷
                    2.5. 兄弟遍歷
                    2.6. 葉子遍歷
                    2.7. 深度遍歷 
                3. 優(yōu)先級隊列
                    3.1. 原理
                    3.2. 內(nèi)幕
                    3.3. 外觀
                4. RSA加解密的證明
                5. DSA數(shù)字簽名的推導(dǎo)
                6. 基于中國剩余定理優(yōu)化RSA解密推論的證明
                7. 總結(jié)AES加密涉及的數(shù)學(xué)定理
                8. 為什么素檢測存在概率多項式時間算法
                9. Blum數(shù)的基本定理及應(yīng)用
                10. 論證有限域上平方根的求解

            GUI 
                1. MFC中的WM_COMMAND傳遞
                2. ATL和WTL中的消息反射
                3. 工作線程與消息循環(huán)
                4. 多窗口的組合與分離
                    4.1. 接口
                    4.2. 實現(xiàn)

            跨平臺
                1. 用戶態(tài)自旋鎖
                2. 互斥鎖
                3. 信號量
                4. socket管道
                5. 鎖框架的設(shè)計與實現(xiàn)

            網(wǎng)絡(luò)
                1. 運用狀態(tài)機異步接收變長包
                2. 基于OpenSSL實現(xiàn)的安全連接
                3. TCP/IP FAQ
                    3.1. 鏈路層、網(wǎng)絡(luò)層和傳輸層
                    3.2. 插口層和應(yīng)用層
                4. Linux套接字與虛擬文件系統(tǒng)
                    4.1. 初始化和創(chuàng)建
                    4.2. 操作和銷毀
                5. Linux ICMP消息的產(chǎn)生與轉(zhuǎn)換
                6. nginx iocp
                    6.1. tcp異步連接
                    6.2. udp異步接收
                    6.3. scm服務(wù)控制
                7. TCP分組丟失時的狀態(tài)變遷
                8. 基于ENet實現(xiàn)可靠UDP通信的同步模型

            Shell應(yīng)用
                1. 自動生成并安裝服務(wù)腳本
                2. nginx升級與恢復(fù)
                3. 使用awk定位反匯編輸出
                4. 自動化批量編譯
            posted @ 2014-04-10 16:04 春秋十二月 閱讀(1855) | 評論 (0)編輯 收藏
               為了方便更改系統(tǒng)tcp內(nèi)核的一些參數(shù),編寫ktcpopt腳本如下
            1#! /bin/bash 
            2# ktcpopt 
            3
            4sed -i '/net.ipv4.tcp_syncookies\|net.ipv4.tcp_tw_reuse\|net.ipv4.tcp_tw_recycle\|net.ipv4.tcp_fin_timeout\|net.ipv4.tcp_max_syn_backlog\|net.ipv4.tcp_max_tw_buckets\|net.ipv4.ip_local_port_range/d' /etc/sysctl.conf
            5
            6sed -i '$a\net.ipv4.tcp_syncookies=1\nnet.ipv4.tcp_tw_reuse=1\nnet.ipv4.tcp_tw_recycle=1\nnet.ipv4.tcp_fin_timeout=30\nnet.ipv4.tcp_max_syn_backlog=8192\nnet.ipv4.tcp_max_tw_buckets=5000\nnet.ipv4.ip_local_port_range=10000 65000' /etc/sysctl.conf

              為了方便配置程序的崩潰調(diào)試,編寫coredump腳本如下
            1#! /bin/bash
            2# coredump
            3
            4sed -i '/ulimit -c unlimited\|export core_path=\/tmp\/corefiles\|mkdir -p $core_path\|echo "0" > \/proc\/sys\/kernel\/core_uses_pid\|echo "$core_path\/%e" > \/proc\/sys\/kernel\/core_pattern/d' ~/.bashrc
            5
            6sed -i '$a\ulimit -c unlimited\nexport core_path=/tmp/corefiles\nmkdir -p $core_path\necho "0" > /proc/sys/kernel/core_uses_pid\necho "$core_path/%e" > /proc/sys/kernel/core_pattern' ~/.bashrc

               從以上2個腳本可以看出,為避免每次調(diào)用腳本時增加重復(fù)行以致配置文件逐漸變大,先刪除已經(jīng)存在的相關(guān)配置,再在末尾增加。這里使用了sed來實現(xiàn)直接在文件中刪除和增加,其中由于刪除操作的匹配模式有多個,因此使用了|符號并用\轉(zhuǎn)義,并且第2個腳本模式文本中含有/符號,這與sed本身的模式限定符/存在歧義,因此也用了\轉(zhuǎn)義;增加使用$a\命令來實現(xiàn)在文件末尾增加配置,并用\n換行。
            posted @ 2014-03-24 18:44 春秋十二月 閱讀(1403) | 評論 (0)編輯 收藏
            腳本概述
               一般地,當(dāng)在目標(biāo)機器編譯安裝某個服務(wù)程序后,為了使服務(wù)能開機自啟動和關(guān)機自停止,則需要將其添加為系統(tǒng)服務(wù)。但不同的Linux系統(tǒng)管理服務(wù)的方法不同,如Ubuntu使用update-rc.d命令,而RedHat則使用chkconfig命令。因此為了能自動識別系統(tǒng)的類型,減少人工控制,編寫了一個簡單的autosrv腳本,要求至少1個最多2個參數(shù),特點如下:
               ● 第1個參數(shù)只能為install或uninstall,表示安裝或卸載服務(wù)。
               ● 第2參數(shù)是可選的,表示系統(tǒng)名稱,如果沒有指定,那么會自動識別,若出現(xiàn)提示錯誤,則表示應(yīng)該要顯式指定系統(tǒng)名稱了。

            腳本實現(xiàn)
              1#! /bin/bash
              2# autosrv
              3
              4if [ $# -lt 1 ]; then
              5    echo "Usage: $(basename "$0") install | uninstall [sysname]"
              6    exit
              7elif [ "$1" != "install" -a "$1" != "uninstall" ]; then
              8    echo "The first parameter must be install or uninstall" 
              9    exit
             10fi
             11
             12action=$1
             13sysname=$2
             14srv_path=/etc/init.d/srv_name
             15
             16if [ -z "$sysname" ]; then
             17    sysname=`lsb_release -a | sed -n '2p' | awk '{if($0~/[Uu][Bb][Uu][Nn][Tt][Uu]/) print "ubuntu"; else if($0~/[Dd][Ee][Bb][Ii][Aa][Nn]/) print "debian"; else if($0~/[Rr][Ee][Dd][Hh][Aa][Tt]/) print "redhat"; else if($0~/[Cc][Ee][Nn][Tt][Oo][Ss]/) print "centos"; else print ""}'`
             18    if [ -z "$sysname" ]; then
             19        echo "Unknown system, please manual special it with the second parameter"
             20        exit
             21    fi
             22    echo "Current system is $sysname"
             23fi
             24
             25create_file_ubuntu_debian()
             26{
             27cat << END > $srv_path
             28#! /bin/bash
             29. /lib/lsb/init-functions
             30
             31END
             32cat srv_name.body >> $srv_path
             33}
             34
             35create_file_redhat_centos()
             36{
             37cat << END > $srv_path
             38#! /bin/bash
             39#chkconfig:2345 90 10
             40#description: srv name
             41
             42. /etc/rc.d/init.d/functions
             43
             44END
             45cat srv_name.body >> $srv_path
             46}
             47
             48chmod_file()
             49{
             50    chmod u+x $srv_path
             51}
             52
             53remove_file()
             54{
             55    rm -f $srv_path
             56}
             57
             58install_ubuntu_debian()
             59{
             60    create_file_ubuntu_debian
             61    chmod_file
             62    update-rc.d srv_name defaults 90 10
             63}
             64
             65uninstall_ubuntu_debian()
             66{
             67    update-rc.d -f srv_name remove
             68    remove_file
             69}
             70
             71install_redhat_centos()
             72{
             73    create_file_redhat_centos
             74    chmod_file
             75    chkconfig --add srv_name
             76}
             77
             78uninstall_redhat_centos()
             79{
             80    chkconfig --del srv_name
             81    remove_file
             82}
             83
             84case "$sysname" in
             85    ubuntu|debian)
             86    if [ "$action" = "install" ]; then
             87        install_ubuntu_debian
             88    else
             89        uninstall_ubuntu_debian
             90    fi
             91    ;;
             92
             93    redhat|centos)
             94    if [ "$action" = "install" ]; then
             95        install_redhat_centos
             96    else
             97        uninstall_redhat_centos
             98    fi
             99    ;;
            100
            101    *)
            102    echo "Currently only support ubuntu, debian, redhat and centos system"
            103    exit
            104    ;;
            105esac
               從上可知,自動識別的方法是獲取lsb_release -a返回的文本再使用awk來匹配ubuntu,redhat,debian,centos這幾個子串(忽略大小寫)。要注意的是,返回的文本可能有所不同。

               當(dāng)系統(tǒng)安裝了LSB模塊時,返回結(jié)果如下
               

               沒有安裝時,返回結(jié)果如下
               
               無論哪種情況,要提取分析的都是第2行文本,因此使用了sed -n '2p'。srv_name.body是不同系統(tǒng)相同的用于生成最終服務(wù)腳本的部分代碼文件,通常包含了start,stop,status,restart幾個函數(shù),只是沒有包含前面的一部分,而這部分則由autosrv腳本來根據(jù)不同的系統(tǒng)生成不同的代碼。
            posted @ 2014-01-03 17:11 春秋十二月 閱讀(1968) | 評論 (1)編輯 收藏
            僅列出標(biāo)題
            共16頁: First 6 7 8 9 10 11 12 13 14 Last 
            国产精品无码久久综合 | 久久亚洲欧洲国产综合| 亚洲av日韩精品久久久久久a| 久久久久综合中文字幕| 久久综合九色综合97_久久久| 色8久久人人97超碰香蕉987| 久久WWW免费人成一看片| 亚洲国产精品嫩草影院久久| 看全色黄大色大片免费久久久| 国产日韩欧美久久| 久久强奷乱码老熟女网站| 午夜福利91久久福利| 亚洲国产精品嫩草影院久久| 思思久久好好热精品国产 | 亚洲精品无码久久久久AV麻豆| 久久国产三级无码一区二区| 久久精品这里只有精99品| 久久久久99精品成人片三人毛片| 久久久久久久久久免免费精品 | 久久精品国产亚洲一区二区| 久久国产精品无码一区二区三区| www.久久热.com| 国产AⅤ精品一区二区三区久久| 久久久久综合国产欧美一区二区| 怡红院日本一道日本久久| 韩国三级中文字幕hd久久精品 | 热re99久久精品国99热| 国产精品久久国产精品99盘| 91精品国产91久久| 久久午夜无码鲁丝片秋霞| 国产精品美女久久久久网| 久久久亚洲精品蜜桃臀| 亚洲精品乱码久久久久66| 色偷偷888欧美精品久久久| 中文字幕久久精品| 国内精品久久久人妻中文字幕| 国产精久久一区二区三区 | 色妞色综合久久夜夜| 久久WWW免费人成—看片| 日日躁夜夜躁狠狠久久AV| 很黄很污的网站久久mimi色|