-
網(wǎng)絡(luò)編程第四天
今天只講了一個(gè)知識(shí)點(diǎn)——select撞蜂。然后就讓我們繼續(xù)做項(xiàng)目,經(jīng)過(guò)不斷的努力,第一階段項(xiàng)目的基本程序已經(jīng)能夠運(yùn)行了,就是會(huì)出現(xiàn)最讓人頭疼的段錯(cuò)誤,只能用今晚到明天下午的這段時(shí)間慢慢更改了疚膊。明天晚上還要進(jìn)行階段考試,考網(wǎng)絡(luò)編程和系統(tǒng)編程的內(nèi)容,希望能夠及格埋合。
一创淡、select:多路復(fù)用
- 得出所有描述符里最大的描述符
- 將所要監(jiān)控的描述符添加對(duì)應(yīng)集合里
- 調(diào)用select
fd_set rfds;
struct timeval tm = {0};
while(1)
{
求最大描述符;(maxfd)
FD_ZERO(&rfds);../../../inc/public.h
FD_SET(fd1,&rfds);
//...FD_SET()
tm.tv_sec = 10;
ret = select(maxfd+1,&rfds,NULL,NULL,&tm);
if(ret < 0)
{//出錯(cuò)
if(errno != EINTR) // 錯(cuò)誤是由于信號(hào)引起
{
break;
}
}
else if(ret == 0)
{//設(shè)定的超時(shí)時(shí)間到了另绩。此時(shí)timeout參數(shù)不可為NULL
}
else
{//ret > 0 此時(shí)表示有多少個(gè)描述符有數(shù)據(jù)可操作
if(FD_ISSET(fd1, &rfds))
{//讀數(shù)據(jù)
............
}
if(FD_ISSET(fd2, &rfds))
{//讀數(shù)據(jù)
.............
}
}
}
二儒陨、由源代碼生成的文件
- 可執(zhí)行文件
- 庫(kù)文件
a. 靜態(tài)庫(kù)([win].lib [linux].a)
b. 動(dòng)態(tài)庫(kù)([win].dll [linux].so)
- 生成可執(zhí)行文件的過(guò)程
預(yù)處理 編譯 匯編 鏈接
a.c a.i a.S a.o
b.c b.i b.S b.o
....... 可執(zhí)行文件
c.c c.i c.S c.o
d.c d.i d.S d.o
libc.a
預(yù)處理:處理#開(kāi)頭的命令
#define / #include :傻替換
#ifdef / #ifndef / #if : 條件編譯
編譯:將C語(yǔ)言語(yǔ)句翻譯成匯編語(yǔ)言(.S)
匯編:將匯編語(yǔ)言翻譯成機(jī)器語(yǔ)言(.o)
鏈接:將所有的.o文件和所用到的庫(kù)文件打包生成可執(zhí)行文件
采用動(dòng)態(tài)庫(kù)文件:動(dòng)態(tài)鏈接:將動(dòng)態(tài)庫(kù)文件中很少的一些內(nèi)容和所有.o進(jìn)行組合
采用靜態(tài)庫(kù)文件:靜態(tài)鏈接:將整個(gè)靜態(tài)庫(kù)文件和所有.o進(jìn)行組合
- linux下生成庫(kù)文件的方式
靜態(tài)庫(kù): ar命令
動(dòng)態(tài)庫(kù):gcc a.c b.c -o libxyz.so -fPIC -shared -Wall
- 如何使用動(dòng)態(tài)庫(kù)文件
a. 編譯的時(shí)候: -lxyz -L目錄
b. 第一次可執(zhí)行文件被執(zhí)行前:
1) 確認(rèn)庫(kù)文件在哪個(gè)目錄下
2)將目錄的路徑設(shè)置到/etc/ld.so.conf文件中
3)執(zhí)行命令sodu ldconfig
c. 運(yùn)行可執(zhí)行文件
三、Makefile
- 為什么要用Makefile
解決:a. 編譯命令過(guò)長(zhǎng)
b. 節(jié)省編譯時(shí)間
```
2. Makefile可以看成是一個(gè)解釋型的編程語(yǔ)言所寫(xiě)源代碼
make命令就是這種源代碼解釋器
3. Makefile文件的主體結(jié)構(gòu)—由規(guī)則組成
一個(gè)規(guī)則的組成:
目標(biāo):依賴列表
[Tab]命令1
[Tab]命令2
.......
[Tab]命令n
4. Makefile模板:(見(jiàn)Lanchat源碼目錄)
a. 變量?jī)?nèi)容要求在同一行(如果想多行寫(xiě)笋籽,必須用\表示續(xù)行)
b. 所有命令所在行必須以Tab鍵開(kāi)頭
c. 要修改的是模板中各個(gè)變量的內(nèi)容(涉及的相對(duì)路徑以Makefile文件所在的目錄為基準(zhǔn))
d. Makefile的文件名:Makefile makefile
5. 命令上執(zhí)行make命令
a. make命令執(zhí)行時(shí)的當(dāng)前路徑必須與Makefile所在目錄相同
b. make會(huì)執(zhí)行當(dāng)前目錄下的Makefile文件
c. 如果make后不跟目標(biāo)名稱蹦漠,則默認(rèn)從第一條規(guī)則開(kāi)始執(zhí)行
```
- gcc常用選項(xiàng)的作用:
-o:output輸出,最終輸出文件叫什么, -o 名字
-Wall:打開(kāi)所有的警告開(kāi)關(guān)
-l:鏈接的時(shí)候需要用到的庫(kù)文件名字, -l庫(kù)名1 -l庫(kù)名2
庫(kù)名: xyz(實(shí)際指使用libxyz.so庫(kù)文件)
-L:鏈接的時(shí)候到哪個(gè)目錄里去尋找?guī)煳募? -L路徑1 -L路徑2
-c:編譯四步车海,只做前三步笛园,生成與.c文件同名的.o文件
-I:指示處理#include命令時(shí),到哪個(gè)目錄去尋找.h文件, -I路徑1 -I路徑2
-fPIC -shared:生成動(dòng)態(tài)庫(kù)文件專用的選項(xiàng)
-g:指示在生成的可執(zhí)行文件添加調(diào)試信息侍芝,以便可以使用gdb對(duì)其進(jìn)行調(diào)試