我正在学习C,我对此感到怀疑。在我的练习中:
while(1){
while((sockacc = accept(ds_sock,&client,&length)) == -1);
--other instructions--
}
谁能告诉我第二次的功能是什么?我的意思是,我知道接受电话是用来做什么的。如果身体里没有任何东西,我不明白为什么要使用while条件。
答案 0 :(得分:4)
您可以将整个代码重写为:
while(1){
do {
sockacc = accept(ds_sock,&client,&length);
}
while(sockacc == -1);
--other instructions--
}
while语句中的部分只是在每次循环迭代时执行,它本身确定循环是否终止。
答案 1 :(得分:4)
退后一步。请记住
的含义while(c) s;
只是一种简短的写作方式:
CONTINUE:
if (c)
goto BODY;
else
goto BREAK;
BODY:
s;
goto CONTINUE;
BREAK: ;
当然break;
和continue;
是goto BREAK;
和goto CONTINUE;
。循环并不神奇;他们只是写一堆goto
陈述的简短而愉快的方式。
所以你的计划:
while(1){
while((sockacc = accept(ds_sock,&client,&length)) == -1);
--other instructions--
}
是一种更好的写作方式:
OUTER_CONTINUE:
if (1)
goto OUTER_BODY;
else
goto OUTER_BREAK;
OUTER_BODY:
{
INNER_CONTINUE:
if ((sockacc = accept(ds_sock,&client,&length)) == -1)
goto INNER_BODY;
else
goto INNER_BREAK;
INNER_BODY:
;
goto INNER_CONTINUE;
INNER_BREAK: ;
--other instructions--
}
goto OUTER_CONTINUE;
OUTER_BREAK: ;
答案 2 :(得分:1)
accept()
可以返回失败(-1)的原因之一是EINTR(系统调用中断)。如果它返回错误EINTR,或者实际上是任何其他错误,则此代码中的内部循环将重试accept()
,因为它不会测试内部循环体中errno
的值。如果错误是EBADF(错误的文件描述符,表明套接字文件描述符不是套接字文件描述符或以某种方式被破坏),这可能是性能问题。通常,您会在循环体中看到一个测试,以确保错误是代码所期望的有限集之一。