打印控制台页面后,如何暂停我的 C 程序?

how can I pause my C program when a page of the console has been printed?

我正在开发一个基本的 SIC 汇编程序,我正在尝试实现的功能之一是在转储功能期间,如果程序在控制台上生成多于一页的文本,它会提示用户在继续之前按下一个键。

我的转储函数读取内存中地址范围的十六进制值。

首先你需要定义什么是"page"。然后你就会知道有多少行可用。然后在打印时停止输入每 X 行(其中 X 是每页的行数),然后再继续打印下 X 行。

因为读取输入会阻塞,直到用户按下 Enter 键(通常),然后您的程序似乎暂停了。

在 POSIX 系统上,最简单的方法是通过 more 传输其输出。或者在有它的系统上,less.

FILE *outfd = popen("less", "w"); 并使用它代替 stdoutpopen(3) 由 POSIX 指定。 more 也是如此,但您可能想先尝试 less。或者更好的是,在回退到 more.

之前使用 getenv("PAGER")

让另一个程序弄清楚终端处理和所有这些,而不是尝试自己动手。

一些非POSIX 系统,例如Windows,也有您可以使用的传呼程序。我认为 Windows 甚至有一个 more 程序,但是如果它在 cygwin 之外的任何标准库中有一个 popen 函数,那么 IDK。


要将 stdout 重定向到管道,您可以使用更多低级 POSIX 函数,例如 dup2(在 SO 上搜索示例)。

但我不认为仅用 popen 就可以轻松地做到这一点。在 GNU C 库 (glibc) 中,您可以分配给 stdout,例如stdout = popen(...);

但其他 C 实现可能不支持:stdout 可以是不支持分配给的宏。 (See the glibc manual's Standard Streams page.)