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

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


咨詢
建站咨詢
