天天看點

資訊安全設計基礎第十周學習總結

附錄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系統)下才能執行。後來在虛拟機中,無法直接粘貼複制主機檔案代碼。通過學習後,将裝置—->共享裝置->共享剪貼闆中,選擇雙向就可以解決了。代碼内容還在嘗試階段。

資訊安全設計基礎第十周學習總結
資訊安全設計基礎第十周學習總結