SIGHUP 終止進(jìn)程 終端線路掛斷
SIGINT 終止進(jìn)程 中斷進(jìn)程
SIGQUIT 建立CORE文件終止進(jìn)程,并且生成core文件
SIGILL 建立CORE文件 非法指令
SIGTRAP 建立CORE文件 跟蹤自陷
SIGBUS 建立CORE文件 總線錯(cuò)誤
SIGSEGV 建立CORE文件 段非法錯(cuò)誤
SIGFPE 建立CORE文件 浮點(diǎn)異常
SIGIOT 建立CORE文件 執(zhí)行I/O自陷
SIGKILL 終止進(jìn)程 殺死進(jìn)程
SIGPIPE 終止進(jìn)程 向一個(gè)沒有讀進(jìn)程的管道寫數(shù)據(jù)
SIGALARM 終止進(jìn)程 計(jì)時(shí)器到時(shí)
SIGTERM 終止進(jìn)程 軟件終止信號(hào)
SIGSTOP 停止進(jìn)程 非終端來的停止信號(hào)
SIGTSTP 停止進(jìn)程 終端來的停止信號(hào)
SIGCONT 忽略信號(hào) 繼續(xù)執(zhí)行一個(gè)停止的進(jìn)程
SIGURG 忽略信號(hào) I/O緊急信號(hào)
SIGIO 忽略信號(hào) 描述符上可以進(jìn)行I/O
SIGCHLD 忽略信號(hào) 當(dāng)子進(jìn)程停止或退出時(shí)通知父進(jìn)程
SIGTTOU 停止進(jìn)程 后臺(tái)進(jìn)程寫終端
SIGTTIN 停止進(jìn)程 后臺(tái)進(jìn)程讀終端
SIGXGPU 終止進(jìn)程 CPU時(shí)限超時(shí)
SIGXFSZ 終止進(jìn)程 文件長度過長
SIGWINCH 忽略信號(hào) 窗口大小發(fā)生變化
SIGPROF 終止進(jìn)程 統(tǒng)計(jì)分布圖用計(jì)時(shí)器到時(shí)
SIGUSR1 終止進(jìn)程 用戶定義信號(hào)1
SIGUSR2 終止進(jìn)程 用戶定義信號(hào)2
SIGVTALRM 終止進(jìn)程 虛擬計(jì)時(shí)器到時(shí)
1) SIGHUP 本信號(hào)在用戶終端連接(正常或非正常)結(jié)束時(shí)發(fā)出, 通常是在終端的控
制進(jìn)程結(jié)束時(shí), 通知同一session內(nèi)的各個(gè)作業(yè), 這時(shí)它們與控制終端
不再關(guān)聯(lián).
2) SIGINT 程序終止(interrupt)信號(hào), 在用戶鍵入INTR字符(通常是Ctrl-C)時(shí)發(fā)出
3) SIGQUIT 和SIGINT類似, 但由QUIT字符(通常是Ctrl-)來控制. 進(jìn)程在因收到
SIGQUIT退出時(shí)會(huì)產(chǎn)生core文件, 在這個(gè)意義上類似于一個(gè)程序錯(cuò)誤信
號(hào).
4) SIGILL 執(zhí)行了非法指令. 通常是因?yàn)榭蓤?zhí)行文件本身出現(xiàn)錯(cuò)誤, 或者試圖執(zhí)行
數(shù)據(jù)段. 堆棧溢出時(shí)也有可能產(chǎn)生這個(gè)信號(hào).
5) SIGTRAP 由斷點(diǎn)指令或其它trap指令產(chǎn)生. 由debugger使用.
6) SIGABRT 程序自己發(fā)現(xiàn)錯(cuò)誤并調(diào)用abort時(shí)產(chǎn)生.
6) SIGIOT 在PDP-11上由iot指令產(chǎn)生, 在其它機(jī)器上和SIGABRT一樣.
7) SIGBUS 非法地址, 包括內(nèi)存地址對(duì)齊(alignment)出錯(cuò). eg: 訪問一個(gè)四個(gè)字長
的整數(shù), 但其地址不是4的倍數(shù).
8) SIGFPE 在發(fā)生致命的算術(shù)運(yùn)算錯(cuò)誤時(shí)發(fā)出. 不僅包括浮點(diǎn)運(yùn)算錯(cuò)誤, 還包括溢
出及除數(shù)為0等其它所有的算術(shù)的錯(cuò)誤.
9) SIGKILL 用來立即結(jié)束程序的運(yùn)行. 本信號(hào)不能被阻塞, 處理和忽略.
10) SIGUSR1 留給用戶使用
11) SIGSEGV 試圖訪問未分配給自己的內(nèi)存, 或試圖往沒有寫權(quán)限的內(nèi)存地址寫數(shù)據(jù).
12) SIGUSR2 留給用戶使用
13) SIGPIPE Broken pipe
14) SIGALRM 時(shí)鐘定時(shí)信號(hào), 計(jì)算的是實(shí)際的時(shí)間或時(shí)鐘時(shí)間. alarm函數(shù)使用該
信號(hào).
15) SIGTERM 程序結(jié)束(terminate)信號(hào), 與SIGKILL不同的是該信號(hào)可以被阻塞和
處理. 通常用來要求程序自己正常退出. shell命令kill缺省產(chǎn)生這
個(gè)信號(hào).
17) SIGCHLD 子進(jìn)程結(jié)束時(shí), 父進(jìn)程會(huì)收到這個(gè)信號(hào).
18) SIGCONT 讓一個(gè)停止(stopped)的進(jìn)程繼續(xù)執(zhí)行. 本信號(hào)不能被阻塞. 可以用
一個(gè)handler來讓程序在由stopped狀態(tài)變?yōu)槔^續(xù)執(zhí)行時(shí)完成特定的
工作. 例如, 重新顯示提示符
19) SIGSTOP 停止(stopped)進(jìn)程的執(zhí)行. 注意它和terminate以及interrupt的區(qū)別:
該進(jìn)程還未結(jié)束, 只是暫停執(zhí)行. 本信號(hào)不能被阻塞, 處理或忽略.
20) SIGTSTP 停止進(jìn)程的運(yùn)行, 但該信號(hào)可以被處理和忽略. 用戶鍵入SUSP字符時(shí)
(通常是Ctrl-Z)發(fā)出這個(gè)信號(hào)
21) SIGTTIN 當(dāng)后臺(tái)作業(yè)要從用戶終端讀數(shù)據(jù)時(shí), 該作業(yè)中的所有進(jìn)程會(huì)收到SIGTTIN
信號(hào). 缺省時(shí)這些進(jìn)程會(huì)停止執(zhí)行.
22) SIGTTOU 類似于SIGTTIN, 但在寫終端(或修改終端模式)時(shí)收到.
23) SIGURG 有"緊急"數(shù)據(jù)或out-of-band數(shù)據(jù)到達(dá)socket時(shí)產(chǎn)生.
24) SIGXCPU 超過CPU時(shí)間資源限制. 這個(gè)限制可以由getrlimit/setrlimit來讀取/
改變
25) SIGXFSZ 超過文件大小資源限制.
26) SIGVTALRM 虛擬時(shí)鐘信號(hào). 類似于SIGALRM, 但是計(jì)算的是該進(jìn)程占用的CPU時(shí)間.
27) SIGPROF 類似于SIGALRM/SIGVTALRM, 但包括該進(jìn)程用的CPU時(shí)間以及系統(tǒng)調(diào)用的
時(shí)間.
28) SIGWINCH 窗口大小改變時(shí)發(fā)出.
29) SIGIO 文件描述符準(zhǔn)備就緒, 可以開始進(jìn)行輸入/輸出操作.
30) SIGPWR Power failure
有兩個(gè)信號(hào)可以停止進(jìn)程:SIGTERM和SIGKILL。 SIGTERM比較友好,進(jìn)程能捕捉這個(gè)信號(hào),根據(jù)您的需要來關(guān)閉程序。在關(guān)閉程序之前,您可以結(jié)束打開的記錄文件和完成正在做的任務(wù)。在某些情況下,假如進(jìn)程正在進(jìn)行作業(yè)而且不能中斷,那么進(jìn)程可以忽略這個(gè)SIGTERM信號(hào)。
對(duì)于SIGKILL信號(hào),進(jìn)程是不能忽略的。這是一個(gè) “我不管您在做什么,立刻停止”的信號(hào)。假如您發(fā)送SIGKILL信號(hào)給進(jìn)程,Linux就將進(jìn)程停止在那里。
一般用于將C++代碼以標(biāo)準(zhǔn)C形式輸出(即以C的形式被調(diào)用),這是因?yàn)镃++雖然常被認(rèn)為是C的超集,但是C++的編譯器還是與C的編譯器不同的。C中調(diào)用C++中的代碼這樣定義會(huì)是安全的。 一般的考慮跨平臺(tái)使用方法如下: #ifdefined(__cplusplus)||defined(c_plusplus) //跨平臺(tái)定義方法 extern "C"{ #endif //... 正常的聲明段 #ifdefined(__cplusplus)||defined(c_plusplus) } #endif 簡單的用在windows下可以如下定義: #ifdef __cplusplus extern "C"{ //... 正常的聲明段 } #endif
1. 信號(hào)概念
信號(hào)是進(jìn)程在運(yùn)行過程中,由自身產(chǎn)生或由進(jìn)程外部發(fā)過來的消息(事件)。信號(hào)是硬件中斷的軟件模擬(軟中斷)。每個(gè)信號(hào)用一個(gè)整型常量宏表示,以SIG開頭,比如SIGCHLD、SIGINT等,它們?cè)谙到y(tǒng)頭文件
信號(hào)的生成來自內(nèi)核,讓內(nèi)核生成信號(hào)的請(qǐng)求來自3個(gè)地方:
l 用戶:用戶能夠通過輸入CTRL+c、Ctrl+,或者是終端驅(qū)動(dòng)程序分配給信號(hào)控制字符的其他任何鍵來請(qǐng)求內(nèi)核產(chǎn)生信號(hào);
l 內(nèi)核:當(dāng)進(jìn)程執(zhí)行出錯(cuò)時(shí),內(nèi)核會(huì)給進(jìn)程發(fā)送一個(gè)信號(hào),例如非法段存取(內(nèi)存訪問違規(guī))、浮點(diǎn)數(shù)溢出等;
l 進(jìn)程:一個(gè)進(jìn)程可以通過系統(tǒng)調(diào)用kill給另一個(gè)進(jìn)程發(fā)送信號(hào),一個(gè)進(jìn)程可以通過信號(hào)和另外一個(gè)進(jìn)程進(jìn)行通信。
由進(jìn)程的某個(gè)操作產(chǎn)生的信號(hào)稱為同步信號(hào)(synchronous signals),例如除0;由象用戶擊鍵這樣的進(jìn)程外部事件產(chǎn)生的信號(hào)叫做異步信號(hào)。(asynchronous signals)。
進(jìn)程接收到信號(hào)以后,可以有如下3種選擇進(jìn)行處理:
l 接收默認(rèn)處理:接收默認(rèn)處理的進(jìn)程通常會(huì)導(dǎo)致進(jìn)程本身消亡。例如連接到終端的進(jìn)程,用戶按下CTRL+c,將導(dǎo)致內(nèi)核向進(jìn)程發(fā)送一個(gè)SIGINT的信號(hào),進(jìn)程如果不對(duì)該信號(hào)做特殊的處理,系統(tǒng)將采用默認(rèn)的方式處理該信號(hào),即終止進(jìn)程的執(zhí)行;
l 忽略信號(hào):進(jìn)程可以通過代碼,顯示地忽略某個(gè)信號(hào)的處理,例如:signal(SIGINT,SIGDEF);但是某些信號(hào)是不能被忽略的,
l 捕捉信號(hào)并處理:進(jìn)程可以事先注冊(cè)信號(hào)處理函數(shù),當(dāng)接收到信號(hào)時(shí),由信號(hào)處理函數(shù)自動(dòng)捕捉并且處理信號(hào)。
有兩個(gè)信號(hào)既不能被忽略也不能被捕捉,它們是SIGKILL和SIGSTOP。即進(jìn)程接收到這兩個(gè)信號(hào)后,只能接受系統(tǒng)的默認(rèn)處理,即終止線程。
2. signal信號(hào)處理機(jī)制
可以用函數(shù)signal注冊(cè)一個(gè)信號(hào)捕捉函數(shù)。原型為:
#include
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signal 的第1個(gè)參數(shù)signum表示要捕捉的信號(hào),第2個(gè)參數(shù)是個(gè)函數(shù)指針,表示要對(duì)該信號(hào)進(jìn)行捕捉的函數(shù),該參數(shù)也可以是SIG_DEF(表示交由系統(tǒng)缺省處理,相當(dāng)于白注冊(cè)了)或SIG_IGN(表示忽略掉該信號(hào)而不做任何處理)。signal如果調(diào)用成功,返回以前該信號(hào)的處理函數(shù)的地址,否則返回 SIG_ERR。
sighandler_t是信號(hào)捕捉函數(shù),由signal函數(shù)注冊(cè),注冊(cè)以后,在整個(gè)進(jìn)程運(yùn)行過程中均有效,并且對(duì)不同的信號(hào)可以注冊(cè)同一個(gè)信號(hào)捕捉函數(shù)。該函數(shù)只有一個(gè)參數(shù),表示信號(hào)值。
示例:
1、 捕捉終端CTRL+c產(chǎn)生的SIGINT信號(hào):
#include
#include
#include
#include
void SignHandler(int iSignNo)
{
printf("Capture sign no:%d ",iSignNo);
}
int main()
{
signal(SIGINT,SignHandler);
while(true)
sleep(1);
return 0;
}
該程序運(yùn)行起來以后,通過按 CTRL+c將不再終止程序的運(yùn)行。應(yīng)為CTRL+c產(chǎn)生的SIGINT信號(hào)已經(jīng)由進(jìn)程中注冊(cè)的SignHandler函數(shù)捕捉了。該程序可以通過 Ctrl+終止,因?yàn)榻M合鍵Ctrl+能夠產(chǎn)生SIGQUIT信號(hào),而該信號(hào)的捕捉函數(shù)尚未在程序中注冊(cè)。
2、 忽略掉終端CTRL+c產(chǎn)生的SIGINT信號(hào):
#include
#include
#include
#include
int main()
{
signal(SIGINT,SIG_IGN);
while(true)
sleep(1);
return 0;
}
該程序運(yùn)行起來以后,將CTRL+C產(chǎn)生的SIGINT信號(hào)忽略掉了,所以CTRL+C將不再能是該進(jìn)程終止,要終止該進(jìn)程,可以向進(jìn)程發(fā)送SIGQUIT信號(hào),即組合鍵CTRL+
3、 接受信號(hào)的默認(rèn)處理,接受默認(rèn)處理就相當(dāng)于沒有寫信號(hào)處理程序:
#include
#include
#include
#include
int main()
{
signal(SIGINT,DEF);
while(true)
sleep(1);
return 0;
}
3. sigaction信號(hào)處理機(jī)制
3.1. 信號(hào)處理情況分析
在signal處理機(jī)制下,還有許多特殊情況需要考慮:
1、 冊(cè)一個(gè)信號(hào)處理函數(shù),并且處理完畢一個(gè)信號(hào)之后,是否需要重新注冊(cè),才能夠捕捉下一個(gè)信號(hào);
2、 如果信號(hào)處理函數(shù)正在處理信號(hào),并且還沒有處理完畢時(shí),又發(fā)生了一個(gè)同類型的信號(hào),這時(shí)該怎么處理;
3、 如果信號(hào)處理函數(shù)正在處理信號(hào),并且還沒有處理完畢時(shí),又發(fā)生了一個(gè)不同類型的信號(hào),這時(shí)該怎么處理;
4、 如果程序阻塞在一個(gè)系統(tǒng)調(diào)用(如read(...))時(shí),發(fā)生了一個(gè)信號(hào),這時(shí)是讓系統(tǒng)調(diào)用返回錯(cuò)誤再接著進(jìn)入信號(hào)處理函數(shù),還是先跳轉(zhuǎn)到信號(hào)處理函數(shù),等信號(hào)處理完畢后,系統(tǒng)調(diào)用再返回。
示例:
#include
#include
#include
#include
int g_iSeq=0;
void SignHandler(int iSignNo)
{
int iSeq=g_iSeq++;
printf("%d Enter SignHandler,signo:%d. ",iSeq,iSignNo);
sleep(3);
printf("%d Leave SignHandler,signo:%d ",iSeq,iSignNo);
}
int main()
{
char szBuf[8];
int iRet;
signal(SIGINT,SignHandler);
signal(SIGQUIT,SignHandler);
do{
iRet=read(STDIN_FILENO,szBuf,sizeof(szBuf)-1);
if(iRet<0){
perror("read fail.");
break;
}
szBuf[iRet]=0;
printf("Get: %s",szBuf);
}while(strcmp(szBuf,"quit ")!=0);
return 0;
}
程序運(yùn)行時(shí),針對(duì)于如下幾種輸入情況(要輸入得快),看輸出結(jié)果:
1、 CTRL+c] [CTRL+c] [CTRL+c]
2、 [CTRL+c] [CTRL+]
3、 hello [CTRL+] [Enter]
4、 [CTRL+] hello [Enter]
5、 hel [CTRL+] lo[Enter]
針對(duì)于上面各種情況,不同版本OS可能有不同的響應(yīng)結(jié)果。
3.2. sigaction信號(hào)處理注冊(cè)
如果要想用程序控制上述各種情況的響應(yīng)結(jié)果,就必須采用新的信號(hào)捕獲機(jī)制,即使用sigaction信號(hào)處理機(jī)制。
函數(shù)原型:
#include
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
sigaction也用于注冊(cè)一個(gè)信號(hào)處理函數(shù)。
參數(shù)signum為需要捕捉的信號(hào);
參數(shù) act是一個(gè)結(jié)構(gòu)體,里面包含信號(hào)處理函數(shù)地址、處理方式等信息。
參數(shù)oldact是一個(gè)傳出參數(shù),sigaction函數(shù)調(diào)用成功后,oldact里面包含以前對(duì)signum的處理方式的信息。
如果函數(shù)調(diào)用成功,將返回0,否則返回-1
結(jié)構(gòu)體 struct sigaction(注意名稱與函數(shù)sigaction相同)的原型為:
struct sigaction {
void (*sa_handler)(int); // 老類型的信號(hào)處理函數(shù)指針
void (*sa_sigaction)(int, siginfo_t *, void *);//新類型的信號(hào)處理函數(shù)指針
sigset_t sa_mask; // 將要被阻塞的信號(hào)集合
int sa_flags; // 信號(hào)處理方式掩碼
void (*sa_restorer)(void); // 保留,不要使用。
}
該結(jié)構(gòu)體的各字段含義及使用方式:
1、字段sa_handler是一個(gè)函數(shù)指針,用于指向原型為void handler(int)的信號(hào)處理函數(shù)地址, 即老類型 的信號(hào)處理函數(shù);
2、字段sa_sigaction也是一個(gè)函數(shù)指針,用于指向原型為:
void handler(int iSignNum,siginfo_t *pSignInfo,void *pReserved);
的信號(hào)處理函數(shù),即新類型的信號(hào)處理函數(shù)。
該函數(shù)的三個(gè)參數(shù)含義為:
iSignNum :傳入的信號(hào)
pSignInfo :與該信號(hào)相關(guān)的一些信息,它是個(gè)結(jié)構(gòu)體
pReserved :保留,現(xiàn)沒用
3、字段sa_handler和sa_sigaction只應(yīng)該有一個(gè)生效,如果想采用老的信號(hào)處理機(jī)制,就應(yīng)該讓sa_handler指向正確的信號(hào)處理函數(shù);否則應(yīng)該讓sa_sigaction指向正確的信號(hào)處理函數(shù),并且讓字段 sa_flags包含SA_SIGINFO選項(xiàng)。
4、字段sa_mask是一個(gè)包含信號(hào)集合的結(jié)構(gòu)體,該結(jié)構(gòu)體內(nèi)的信號(hào)表示在進(jìn)行信號(hào)處理時(shí),將要被阻塞的信號(hào)。針對(duì)sigset_t結(jié)構(gòu)體,有一組專門的函數(shù)對(duì)它進(jìn)行處理,它們是:
#include
int sigemptyset(sigset_t *set); // 清空信號(hào)集合set
int sigfillset(sigset_t *set); // 將所有信號(hào)填充進(jìn)set中
int sigaddset(sigset_t *set, int signum); // 往set中添加信號(hào)signum
int sigdelset(sigset_t *set, int signum); // 從set中移除信號(hào)signum
int sigismember(const sigset_t *set, int signum); // 判斷signnum是不是包含在set中
例如,如果打算在處理信號(hào)SIGINT時(shí),只阻塞對(duì)SIGQUIT信號(hào)的處理,可以用如下種方法:
struct sigaction act;
sigemptyset(&act.sa_mask);
sigaddset(&act_sa_mask,SIGQUIT);
sigaction(SIGINT,&act,NULL);
5、 字段sa_flags是一組掩碼的合成值,指示信號(hào)處理時(shí)所應(yīng)該采取的一些行為,各掩碼的含義為:
掩碼 描述
SA_RESETHAND 處理完畢要捕捉的信號(hào)后,將自動(dòng)撤消信號(hào)處理函數(shù)的注冊(cè),即必須再重新注冊(cè)信號(hào)處理函數(shù),才能繼續(xù)處理接下來產(chǎn)生的信號(hào)。該選項(xiàng)不符合一般的信號(hào)處理流程,現(xiàn)已經(jīng)被廢棄。
SA_NODEFER 在處理信號(hào)時(shí),如果又發(fā)生了其它的信號(hào),則立即進(jìn)入其它信號(hào)的處理,等其它信號(hào)處理完畢后,再繼續(xù)處理當(dāng)前的信號(hào),即遞規(guī)地處理。如果sa_flags包含了該掩碼,則結(jié)構(gòu)體sigaction的sa_mask將無效!
SA_RESTART 如果在發(fā)生信號(hào)時(shí),程序正阻塞在某個(gè)系統(tǒng)調(diào)用,例如調(diào)用read()函數(shù),則在處理完畢信號(hào)后,接著從阻塞的系統(tǒng)返回。該掩碼符合普通的程序處理流程,所以一般來說,應(yīng)該設(shè)置該掩碼,否則信號(hào)處理完后,阻塞的系統(tǒng)調(diào)用將會(huì)返回失敗!
SA_SIGINFO 指示結(jié)構(gòu)體的信號(hào)處理函數(shù)指針是哪個(gè)有效,如果sa_flags包含該掩碼,則sa_sigactiion指針有效,否則是sa_handler指針有效。
首先聲明 :這是我借鑒別人聯(lián)合自己的交叉編譯經(jīng)驗(yàn)做改動(dòng)而來的
1。# tar zxvf sqlite-3.3.7.tar.gz
#cd /usr/local/arm-linux/sqlite-3.3.7
新建一個(gè)sqlite-arm-linux目錄
2.# mkdir /usr/local/arm-linux/sqlite-arm-linux
3.# cd /usr/local/arm-linux/sqlite-arm-linux
# export PATH=/usr/local/arm-linux/bin:$PATH
4.#../sqlite-3.3.7/configure --host=arm-linux --prefix=/usr/local/arm-linux/sqlite-arm-linux
這部會(huì)出現(xiàn)下面的錯(cuò)誤:
configure: error: unable to find a compiler for building build tools
這個(gè)錯(cuò)誤的解決方法是:
首先,我們進(jìn)入目錄usr/local/arm-linux/sqlite-1.3.7,打開其中的configure文件,用查找功能找到下列語句:
(用 test "$cross_compiling" = yes &&進(jìn)行搜索)
# test "$cross_compiling" = yes &&
# { { echo "$as_me:13264: error: cannot check for file existence when cross compiling" >&5
#echo "$as_me: error: cannot check for file existence when cross compiling" >&2;}
# { (exit 1); exit 1; }; }
把其中的{ (exit 1); exit 1; }; }改為 { (echo 1); echo 1; }; }
一共有兩處,都改過來。
然后,我們要設(shè)置config_TARGET_CC和config_BUILD_CC兩個(gè)環(huán)境變量。config_TARGET_CC是交叉編譯器,config_BUILD_CC是主機(jī)編譯器。重來:
#export config_BUILD_CC=gcc
#export config_TARGET_CC=arm-linux-gcc
下面重新編譯就可以了
#../sqlite-3.3.7/configure --host=arm-linux --prefix=/usr/local/arm-linux/sqlite-arm-linux
然后我們會(huì)發(fā)現(xiàn)在在/usr/local/arm-linux/sqlite-arm-linux目錄下生成一些相關(guān)文件: config.log config.status libtool Makefile sqlite3.pc
如果:還是出現(xiàn)如下同樣的錯(cuò)誤
checking for /usr/include/readline.h... configure: error: cannot check for file existence when cross compiling
那么 首先 : 你檢查你的交叉編譯環(huán)境 錯(cuò)誤?? 如果真的沒有則安裝readline.h 在ubuntu的軟件中心查找libncurses5-dev libreadline5-dev進(jìn)行安裝
如果安裝之后從新。/conigure還是有這個(gè)錯(cuò)誤 那就不管了 我不知道了但是還是生成了makefile文件!
下面在make之前我們修改一下Makefile文件,把其中的BCC = arm-linux-gcc -g -O2 為 BCC = gcc -g -O2
#make
#make install
會(huì)出現(xiàn)這樣的話語:libsqlite3.so.0.8.6: ELF 32-bit LSB shared object, ARM, version 1 (ARM), not stripped
over !!!
eth0 Link encap:Ethernet HWaddr 00:0c:29:05:48:93
inet addr:192.168.188.128 Bcast:192.168.188.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe05:4893/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:18 errors:0 dropped:0 overruns:0 frame:0
TX packets:69 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2134 (2.1 KB) TX bytes:10542 (10.5 KB)
Interrupt:19 Base address:0x2024
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
聯(lián)網(wǎng)成功
由上可見etho聯(lián)網(wǎng)成功
但是lo并沒有 在、etc/network/interfaces 里面可見
auto lo
iface lo inet loopback
原來 lo是本地回環(huán)地址 在ping127.0.0.1 時(shí)被使用到