【Socket网络编程】14. perror()、errno 的使用
經(jīng)常會在socket網(wǎng)絡(luò)編程時看到errno和perror(),他們是什么呢?
函數(shù)定義:
void perror(const char *s); perror ("open_port");他是c語言庫函數(shù),需要包含頭文件(不可以掉了這個頭文件):
#include <stdio.h> //包含perror的頭文件函數(shù)說明
perror ( )用 來 將 上 一 個函 數(shù) 發(fā) 生 錯 誤 的 原 因 輸 出 到 標 準 設(shè)備 (stderr) 。參數(shù) s 所指的字符串會先打印出,后面再加上錯誤原因字符串。此錯誤原因依照全局變量errno的值來決定要輸出的字符串。
在庫函數(shù)中有個errno變量,每個errno值對應(yīng)著以字符串表示的錯誤類型。當(dāng)你調(diào)用"某些"函數(shù)出錯時,該函數(shù)已經(jīng)重新設(shè)置了errno的值。perror()函數(shù)只是將你輸入的一些信息和現(xiàn)在的errno所對應(yīng)的錯誤一起輸出。
errno 是記錄系統(tǒng)的最后一次 錯誤代碼 。代碼是一個int型的值,在errno.h中定義。
只有當(dāng)一個 庫函數(shù)失敗時,errno才會被設(shè)置。當(dāng)函數(shù)成功運行時,errno的值不會被修改。這意味著我們不能通過測試 errno 的值來判斷是否有錯誤存在。反之,只有當(dāng)被調(diào)用的函數(shù)提示有錯誤發(fā)生時檢查 errno 的值才有意義。
查看 錯誤代碼 errno 是調(diào)試程序的一個重要方法。當(dāng)linux C api函數(shù)發(fā)生異常時,一般會將errno變量(需include errno.h)賦一個整數(shù)值,不同的值表示不同的含義,可以通過查看該值推測出錯的原因。在實際編程中用這一招解決了不少原本看來莫名其妙的問題。
舉例:
#include <stdio.h>//包含perror的頭文件 #include <process.h> #include <direct.h>//包含mkdir、rmdir的頭文件 #include <iostream> using namespace std; int main(void) {int status;system("cls");//清屏status = mkdir("cam");//創(chuàng)建文件夾,創(chuàng)建成功則返回0,否則返回-1cout << status << endl;(!status) ? (printf("Directory created\n")) : (perror("Unable to create directory\n"));//!status不等于0為真,結(jié)果為第一個,否則為第二個system("pause");//屏幕暫停system("dir"); /*顯示創(chuàng)建后當(dāng)前文件夾下的文件信息*/status = rmdir("cam"); /*刪除創(chuàng)建的文件夾book*/(!status) ? (printf("Directory deleted\n")) :(perror("Unable to delete directory"));system("pause");return 0; }
如果我們的文件夾已經(jīng)存在,仍然使用mkdir函數(shù)創(chuàng)建文件夾時,會發(fā)生什么呢?(此時perror函數(shù)就會發(fā)揮作用)
因為cam文件夾已經(jīng)存在,所以mkdir返回-1,perror除了輸出:Unable to create directory,后面緊跟著具體原因:File exists
總結(jié)
以上是生活随笔為你收集整理的【Socket网络编程】14. perror()、errno 的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++】21.函数传参 传指针和传引用
- 下一篇: 【Socket网络编程】15. 发送端和