新聞中心
隨著互聯(lián)網(wǎng)的發(fā)展,Linux操作系統(tǒng)已經(jīng)成為企業(yè)級應(yīng)用、云計(jì)算等領(lǐng)域的首選系統(tǒng)。但Linux系統(tǒng)的復(fù)雜性也導(dǎo)致了在運(yùn)行過程中出現(xiàn)各種錯誤和故障。為了更好地理解和解決這些問題,我們需要了解Linux系統(tǒng)常見的錯誤值和錯誤代碼,以便迅速診斷和修復(fù)系統(tǒng)故障。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、甌海網(wǎng)站維護(hù)、網(wǎng)站推廣。
Linux系統(tǒng)錯誤值簡介:
Linux系統(tǒng)中的大多數(shù)錯誤都涉及到系統(tǒng)調(diào)用結(jié)果的帶符號整數(shù)返回碼。返回值小于0表示錯誤,而大于等于0的返回值表示成功。錯誤碼通常在兩個(gè)頭文件和中定義,以便使用下列宏在程序中引用。
這里列出了Linux系統(tǒng)在返回-1時(shí)的一些錯誤碼:
| 錯誤碼 | 錯誤描述 |
| —— | —————————- |
| EPERM | 操作不允許 |
| ENOENT | 源文件不存在 |
| ESRCH | 執(zhí)行目標(biāo)進(jìn)程不存在 |
| EINTR | 被中斷的系統(tǒng)調(diào)用重試 |
| EIO | 輸入輸出錯誤 |
| ENXIO | 設(shè)備不存在 |
| E2BIG | 參數(shù)列表過長 |
| ENOEXEC| 執(zhí)行格式出錯 |
| EBADF | 錯誤的文件描述符 |
| ECHILD | 進(jìn)程不存在 |
| EAGN | 無法獲取鎖資源,重試 |
| ENOMEM | 內(nèi)存不足 |
| EACCES | 權(quán)限不足 |
| EFAULT | 參數(shù)指針非法 |
| EBUSY | 資源正被占用無法使用 |
| EEXIST | 文件已存在 |
| EXDEV | 不同設(shè)備間的鏈接 |
| ENODEV | 設(shè)備不存在 |
| ENOTDIR| 不是目錄 |
| EISDIR | 是目錄 |
| EINVAL | 參數(shù)無效 |
| ENFILE | 文件表已滿 |
| EMFILE | 進(jìn)程的文件描述符數(shù)已達(dá)到上限 |
| ENOTTY | 操作不支持的終端 |
| ETXTBSY| 只讀文件的寫入被阻止 |
| EFBIG | 文件太大 |
| ENOSPC | 設(shè)備空間不足 |
| ESPIPE | seek()超出了文件尾部 |
| EROFS | 文件系統(tǒng)只讀 |
| EMLINK | 超過磁盤表數(shù) |
| EPIPE | 管道破裂 |
| ENAMETOOLONG|路徑名太長 |
| ENOLCK | 系統(tǒng)內(nèi)的鎖已使用完 |
以上錯誤碼只是一部分,Linux系統(tǒng)中還有許多其他錯誤碼,這些錯誤碼在很大程度上反映了系統(tǒng)的狀態(tài)和問題,因此熟悉這些錯誤碼對于快速定位并解決問題非常有幫助。
如何解決Linux錯誤值:
在程序中,我們經(jīng)常需要判斷一些函數(shù)是否執(zhí)行成功,這就需要對返回的錯誤值進(jìn)行解析和判斷。例如,常用的文件操作函數(shù)open()和read()可能會遇到一些錯誤,如文件不存在、文件權(quán)限不足、磁盤空間不足等等。當(dāng)這些情況發(fā)生時(shí),函數(shù)會返回相應(yīng)的錯誤碼。正確的做法是檢查函數(shù)返回值,并根據(jù)返回值進(jìn)行相應(yīng)的操作。
以下是一個(gè)文件讀取程序的示例代碼:
“`c
#include
#include
#include
#include
int mn(int argc, char **argv) {
int fd;
char buf[1024];
fd = open(“/path/to/file”, O_RDON);
if (fd == -1) {
perror(“open”);
exit(EXIT_FLURE);
}
if (read(fd, buf, 1024) == -1) {
perror(“read”);
exit(EXIT_FLURE);
}
if (close(fd) == -1) {
perror(“close”);
exit(EXIT_FLURE);
}
exit(EXIT_SUCCESS);
}
“`
在程序中,我們首先使用open()函數(shù)打開文件,如果文件打開失敗,它會返回-1,并將errno設(shè)置為相應(yīng)的錯誤碼。我們使用perror()函數(shù)將錯誤信息輸出到標(biāo)準(zhǔn)錯誤流,然后使用exit()函數(shù)退出程序。
錯誤處理的概念和方法同樣適用于其他系統(tǒng)調(diào)用和庫函數(shù)。每次調(diào)用系統(tǒng)函數(shù)之后都應(yīng)該檢查錯誤碼,并采取相應(yīng)的行動??梢詫㈠e誤處理代碼封裝進(jìn)函數(shù)中,便于復(fù)用和修改。
:
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220Linux中SIG_ERR值是什么
糾正一下:
輸出in sig_fun1:30就是第二次調(diào)用的時(shí)候輸出的,之一次調(diào)用只是綁定了SIGUSR1的信號處理函數(shù),不會進(jìn)入該處理函數(shù)
為什么會有這樣的輸出呢?
signal函數(shù)是將信號與處理函數(shù)進(jìn)行綁定,成功綁定則返回綁定之前的信號處理函數(shù)。那么來看看你的代碼,之一次調(diào)用將sig_fun1綁定,無輸出;第二次調(diào)用將sig_fun2綁定,也就是把sig_fun1替換下來,并且你還調(diào)用了它,參數(shù)為30,所以會有那樣的輸出。
該如何改呢?
其實(shí)你并沒有涉及到linux的信號處理機(jī)制,光綁定是不夠的,還需要發(fā)信號給它,才能真正進(jìn)入信號處理過程。給你一個(gè)示例代碼吧
#include
#include
#include
#include
void sig_fun2(int signo)
{
printf(“in sig_fun2:%d\n”, signo);
}
void sig_fun1(int signo)
{
printf(“in sig_fun1:%d\n”, signo);
}
int main()
{
unsigned long i;
if (signal(SIGUSR1, sig_fun1) == SIG_ERR)
{
printf(“signal fun1 error\n”);
exit(1);
}
sleep(15);
(signal(SIGUSR1, sig_fun2))(30);
sleep(15);
printf(“done\n”);
return 0;
}
/****************************C 代碼完,下面是如何運(yùn)行***************************/
首先編譯,假設(shè)生成可執(zhí)行程序?yàn)閠est
然后運(yùn)行,我用的是后臺運(yùn)行: nohup ./test>output.txt &
注意,這種手脊方法要將輸出重定向到文件output.txt(名字無所謂),然后你會看到一個(gè)數(shù)字,就是pid進(jìn)程號
最后,在15秒之內(nèi)發(fā)送信號:kill -SIGUSR1 進(jìn)程號
現(xiàn)在你就可以打開output.txt看輸出結(jié)果了。如果用sleep的話會被打斷,所以只有兩個(gè)輸出加上替換處理函數(shù)時(shí)的輸出共3個(gè),也可以換成 int n=15;while(n–)sleep(1);
—–
怎么樣,加分吧
—–
1.我就是想問第二次綁定sig_fun2的時(shí)候,調(diào)用了之一次綁定的sig_fun1么?
調(diào)用了, (signal(SIGUSR1, sig_fun2))(30);就是這一句, signal(SIGUSR1, sig_fun2)是個(gè)函數(shù)指針,你這樣寫就是調(diào)用它了,但是這和信號處理沒關(guān)系,寫成signal(SIGUSR1, sig_fun2);就可以了
這就是你所說的成功則返回綁定之前的函數(shù)???
對
那當(dāng)時(shí)綁定sig_fun1的時(shí)候,返回之前的處理函數(shù)是什么??
這個(gè)就是系統(tǒng)默認(rèn)的了,比如SIGINT就是你ctrl+c取消程序執(zhí)行發(fā)送或氏的信號,它的處理函數(shù)就是結(jié)束程序的一系列動作,不過SIGUSR1是留給用戶自定義的信號,系統(tǒng)默認(rèn)應(yīng)該是啥也不做的一個(gè)函數(shù),例如void fun(int signo){},你也可以之一次綁定的時(shí)候就調(diào)用試試看對不對
2.還有我在看signal函數(shù)定義的時(shí)候,void(//…)(int) 最衫薯散后傳入的這個(gè)int整形參數(shù)就是我們自定義sig_fun()中所接收的30么??我看例子里面有的signal(SIGINT,myfunc);也沒有帶參數(shù)啊,搞不懂
是你理解錯了,signal函數(shù)只是綁定,沒涉及到調(diào)用綁定函數(shù),不用帶參數(shù),信號處理函數(shù)不是像你這樣調(diào)用的。callback回調(diào)你知道吧,就是先做好一個(gè)函數(shù)或過程放著,事件觸發(fā)的時(shí)候才調(diào)用。那個(gè)30是你用普通函數(shù)調(diào)用的方式時(shí)的參數(shù),跟信號處理一點(diǎn)關(guān)系也沒有,你用60,70也沒半毛錢關(guān)系。我猜你是想要調(diào)用信號處理函數(shù),然后迷糊了,其實(shí)我上面說的“kill -SIGUSR1 進(jìn)程號”就是觸發(fā)程序調(diào)用該處理函數(shù)的信號,這和kill -9 殺死進(jìn)程一個(gè)道理,只不過處理函數(shù)不同,結(jié)果不一樣。ctrl+c也可以用信號的方式發(fā)送,kill -2 進(jìn)程號,或者 kill -SIGINT 進(jìn)程號
linux 錯誤值的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux 錯誤值,掌握Linux錯誤值,避免系統(tǒng)出錯!,Linux中SIG_ERR值是什么的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)【028-86922220】值得信賴的成都網(wǎng)站建設(shè)公司。多年持續(xù)為眾多企業(yè)提供成都網(wǎng)站建設(shè),成都品牌建站設(shè)計(jì),成都高端網(wǎng)站制作開發(fā),SEO優(yōu)化排名推廣服務(wù),全網(wǎng)營銷讓企業(yè)網(wǎng)站產(chǎn)生價(jià)值。
網(wǎng)頁標(biāo)題:掌握Linux錯誤值,避免系統(tǒng)出錯!(linux錯誤值)
文章轉(zhuǎn)載:http://fisionsoft.com.cn/article/cdcpcpp.html


咨詢
建站咨詢
