附錄A 錯誤處理
1.Unix系統中的錯誤處理
Unix風格的wait函數遇到一個錯誤(例如沒有子程序要回收),它就傳回-1,并将全局變量errno設定為知名錯誤原因的錯誤代碼。如果wait成功完成,就傳回有用的結果。
錯誤代碼的形式:
if ((pid = wait(NULL)) < 0){
fprintf(stderr,"wait error:%s\n",strerror(errno));
exit(0);
}
其中,strerror函數傳回某個errno值的文本描述。
2.Posix風格的錯誤處理
Posix風格:任何有用的結果都傳回在通過引用傳遞進來的函數參數中。Posix風格的錯誤代碼的形式:
if((retcode = pthread_create(&tid,NULL,thread,NULL))!=0){
fprintf(stderr,"pthread_create error: %s\n",strerror(retcode));
exit(0);
}
3.DNS風格的錯誤處理
函數在失敗時傳回NULL指針,并設定全局變量h_errno。
if((p=gethostbyname(name))==NULL){
fprintf(stdder,"gethostname error: %s\n:",hstrerror(h_errno));
exit(0);
}
錯誤函數報告的代碼
void unix_error(char *msg)
{
fprintf(stderr,"%s: %s\n",msg,strerror(errno));
exit(0);
}
void poisx_error(int code,char *msg)
{
fprintf(stderr, "%s: %s\n",msg,strerror(code));
exit(0);
}
void dns_error(char *msg)
{
fprintf(stderr,k "%s: DNS error %d\n",msg,h_errno);
exit(0);
}
void app_error(char *msg)
{
fprintf(stderr,"%s\n",msg);
exit(0);
}
pid_Wait(int *status)
{
pid_t pid;
if ((pid = wait(status)) < 0)
unix_error("Wait error");
return pid;
}
錯誤處理包裝函數
Unix風格的錯誤處理包裝函數
void Kill(pid_t pid,int signum)
{
int rc;
if ((rc = kill(pid,signum)) < 0)
unix_error("Kill error");
}
Posix風格的錯誤處理包裝函數
void Ppthread_detach(pthread_t tid){
int rc;
if ((rc = pthread_detach(tid))!=0)
posix_error(rc, "Pthread_detach error");
DNS風格的錯誤處理包裝函數
struct hostent *Gethostbyname(const char *name)
{
struct hostent *p;
if ((p=gethostbyname(name))==NULL)
dns_error("Gethostbyname error");
return p;
參考資料:《深入了解計算機系統》
問題及解決:運作實踐代碼時,一開始用vc運作,缺少頭檔案。之後網上找了頭檔案的源碼,插入到工程中,依然還是不可以。VC打不開頭檔案。查閱了一下,原來該檔案需要在Linux系統(非Windows系統)下才能執行。後來在虛拟機中,無法直接粘貼複制主機檔案代碼。通過學習後,将裝置—->共享裝置->共享剪貼闆中,選擇雙向就可以解決了。代碼内容還在嘗試階段。
