0

我正在使用 ANSI C 和 OpenMPI 库。

我有这个代码:

if(myRank == 0)
{
    printf("\n\tEnter bright: ");
    scanf("%d", &bright);
}

但是当我运行程序时,它首先等待按键(scanf)然后 printf。我真的不知道发生了什么。

谢谢你。

4

2 回答 2

1

这与 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 重定向机制也可能是行缓冲的。

于 2013-11-09T11:28:03.997 回答
0

我首先想知道以这种方式使用 scanf 是否有意义(将涉及多个进程——我们如何知道或假设它们中的任何一个都将连接到您的终端/键盘?)。但无论如何,打印后尝试冲洗:

printf("\n\tEnter bright: ");
fflush(stdout);
scanf("%d", &bright);
于 2013-11-09T04:03:55.737 回答