信息安全设计基础第十周学习总结
附录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系统)下才能执行。后来在虚拟机中,无法直接粘贴复制主机文件代码。通过学习后,将设备—->共享设备->共享剪贴板中,选择双向就可以解决了。代码内容还在尝试阶段。