解决此问题的一种方法是IGUR() 函数,如下所示。极其丑陋,但仍然有些便携。 (对于不理解 inline 的旧编译器,只需 #define inline /*nothing*/,就像往常一样。)
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
inline void IGUR() {} /* Ignore GCC Unused Result */
void IGUR(); /* see https://stackoverflow.com/a/16245669/490291 */
int
main(int argc, char **argv)
{
char buf[10*BUFSIZ];
int got, fl, have;
fl = fcntl(0, F_GETFL);
fcntl(0, F_SETFL, fl|O_NONBLOCK);
have = 0;
while ((got=read(0, buf, sizeof buf))>0)
{
IGUR(write(1, buf, got));
have = 1;
}
fcntl(0, F_SETFL, fl);
return have;
}
顺便说一句,此示例非阻塞地从stdin 复制到stdout,直到读取所有等待的输入,如果没有任何内容则返回true (0),否则返回false (1)。 (它可以防止 while read -t1 away; do :; done 在 bash 中出现 1 秒延迟。)
在-Wall (Debian Jessie) 下无警告地编译。
编辑:IGUR() 也需要在没有 inline 的情况下定义,以便它可以用于链接器。否则cc -O0 可能会失败。见:https://stackoverflow.com/a/16245669/490291
Edit2:较新的gcc 要求inline 在void 之前。