![]() |
1
1
当文件描述符被复制时,如
|
![]() |
2
2
我有两个答案:
每个系统调用都可以返回eintr,特别是一个阻止read(2)等待慢人的系统调用。这是一个更可能的场景,一个好的“从终端获取输入”例程确实会检查这一点。这也意味着写入(2)可能会失败,即使在写入日志文件时也是如此。您是否尝试记录记录器生成的错误,还是应该放弃? |
![]() |
3
0
另一种可能性是,他的函数只在一个应用程序(或其中的一部分)中使用,该应用程序已经做了一些事情来确保调用不会被信号中断。如果你不打算对信号做任何重要的事情,那么你就不必对它们做出响应,把它们全部屏蔽掉可能是有意义的,而不是把每个阻塞的系统调用都包在一个eintr重试中。当然,除了那些会杀了你的,所以sigkill,如果你通过退出来处理它,通常是sigpipe,还有sigsegv和类似的致命错误,这些错误在任何情况下都不会传递到正确的用户空间应用程序。
不管怎样,如果他所说的只是安全问题,那么很可能他不必再试了
通常,您希望您的程序尽最大努力获得成功,这意味着在eIntr上重试。但这与安全无关。如果您的程序设计为某个函数由于任何原因失败不是安全缺陷,那么特别是
发生
失败不是一个缺点,而不是因为一个永久的原因。众所周知,DJB相当固执己见,所以如果他证明了他不这么做的原因,我一点也不惊讶。
需要
重试,因此不麻烦,即使这样做可以让他的程序在某些情况下成功地刷新句柄,在某些情况下,句柄当前可能会失败(例如
编辑:在某些情况下,在eIntr上重试本身可能是一个安全缺陷。它为这段代码引入了一种新的行为:它可以无限期地循环以响应信号泛滥,在此之前它会尝试
您可能认为重试可以防止DoS缺陷,即信号导致虚假故障。但重试允许另一个(更困难的)DOS缺陷,即信号泛滥导致无限期暂停。以二进制形式“这个应用程序可以关闭吗?”,这是djb在编写qmail和djbdns时感兴趣的绝对安全问题,没有区别。如果某件事可以发生一次,那么通常这意味着它可以发生很多次。 |
![]() |
4
0
只有破碎的孤岛才会回来
值得注意的是
不
系统将返回
|
![]() |
Community wiki · C中有哪些耗时的操作? 1 年前 |
![]() |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
![]() |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
![]() |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |