一个超时删除节点的程序
本来一个很容易的子函数,但是我怎么写都是段错误,大家帮我看看这个有什么错误!
程序目的:在主函数中设定alarm(5),signalset捕捉alarm信号,捕捉到就调用下面的子程序,遍历整个链表,将节点中的时间和当前时间比较,时间差超过5秒就把这节点删掉,链表中可能不止一个节点超时,要把每一个超时的都删掉,下面是代码
void comp_time(struct ip_info *head){ struct ip_info *tmp; struct ip_info *tmp2; long int s; /*再次设定时间*/ alarmset(); printf("\nalarm 再次设定\n"); /*取得当前的时间 * gettimeofday函数可以给timeval的结构体赋值 */ gettimeofday(&now,NULL); printf("2222222222"); if(head == NULL) { printf("list is NULL!\n"); exit(0); } tmp = head; //head为链表的头 tmp2 = head; printf("11111111111111111"); /*使用do,while语句循环完所有的节点*/ do { s = (now.tv_sec - tmp->get_time.tv_sec)*1000000 + (now.tv_usec - tmp->get_time.tv_usec); /*如果当前的节点不符合条件就continue*/ while(s < over_time) { tmp2 = tmp; tmp = tmp->next; s = (now.tv_sec - tmp->get_time.tv_sec)*1000000 + (now.tv_usec - tmp->get_time.tv_usec); continue; //不知道这个该不该加 } if(tmp == head) { head = tmp->next; tmp2 = tmp; tmp = tmp->next; free(tmp2); } else { tmp2 = tmp; tmp = tmp->next; free(tmp2); } }while(tmp != NULL);}
else if( tmp == NULL)//还要加个判断语句 { break; } else { tmp2 = tmp; tmp = tmp->next; free(tmp2); }
[解决办法]
void comp_time(struct ip_info *head){ struct ip_info *tmp; struct ip_info *pre; long int s; /* TODO : 记录当前时间 */ long int now; /*再次设定时间*/ alarmset(); printf("\nalarm 再次设定\n"); /*取得当前的时间 * gettimeofday函数可以给timeval的结构体赋值 */ gettimeofday(&now,NULL); tmp = head; //head为链表的头 pre = head;//pre /* TODO : 获取当前时间 你愿意也可以放循环里面....*/ now = now.tv_sec*1000000 + now.tv_usec; while ( tmp != NULL ) { s = tmp->get_time.tv_sec*1000000 + tmp->get_time.tv_usec; if ( (now - s) >= over_time) { /* TODO : 这里就是所有超时的节点 */ if (tmp == pre) { head = head->next; free(tmp); tmp = head; pre = head; } else { pre->next = tmp->next; free(tmp); tmp = pre->next; } continue; } pre = tmp; tmp = tmp->next; }}
------解决方案--------------------
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。