我正在使用 ANSI C 和 OpenMPI 库。
我有这个代码:
if(myRank == 0)
{
printf("\n\tEnter bright: ");
scanf("%d", &bright);
}
但是当我运行程序时,它首先等待按键(scanf)然后 printf。我真的不知道发生了什么。
谢谢你。
这与 MPI 没有什么特别的关系,是一种非常正常的 Unix I/O 行为。标准输出流是行缓冲的,这意味着除非在流中遇到新行或强制执行刷新操作,否则不会将任何内容发送到底层 I/O 子系统。
比较以下:printf("asdasd");
和printf("asdasd\n");
。在第一种情况下,asdasd
将附加到stdout
流的缓冲区,但由于那里没有新行,因此缓冲区不会被刷新,并且实际上没有任何内容发送到终端。在第二种情况下asdasd
,附加到输出流中,然后新行的存在会导致自动刷新,因此asdasd<new line>
您会立即看到。正如 John Zwinck 已经展示的那样,fflush(stdout);
可用于强制刷新流缓冲区。
请注意,如果您来自 Windows 背景,则那里的标准输出没有行缓冲,并且printf("asdasd");
确实会导致在adsasd
没有后续显式刷新操作的情况下输出。但是,即使在 Windows 上,MPI 的 I/O 重定向机制也可能是行缓冲的。
我首先想知道以这种方式使用 scanf 是否有意义(将涉及多个进程——我们如何知道或假设它们中的任何一个都将连接到您的终端/键盘?)。但无论如何,打印后尝试冲洗:
printf("\n\tEnter bright: ");
fflush(stdout);
scanf("%d", &bright);