В системах POSIX самый простой способ - передать данные через more
.Или в системах, которые его имеют, less
.
FILE *outfd = popen("less", "w");
и используйте его вместо stdout
.popen(3)
определяется POSIX.Так же и more
, но вы можете сначала попробовать less
.Или лучше: используйте getenv("PAGER")
, прежде чем вернуться к more
.
Пусть другая программа выяснит обработку терминала и все это вместо того, чтобы пытаться свернуть свою собственную.
Некоторые не POSIX-системы, такие как Windows, также имеют программы пейджера, которые вы можете использовать.Я думаю, что в Windows даже есть программа more
, но IDK, если она имеет функцию popen
в любой стандартной библиотеке за пределами cygwin.
Чтобы перенаправить stdout
в канал, вы можете использоватьболее низкоуровневые функции POSIX, такие как dup2
(ищите в SO примеры).
Но я не думаю, что вы можете сделать это в основном с помощью всего лишь popen
.В библиотеке GNU C (glibc) вы можете назначить stdout
, например, stdout = popen(...);
Но другие реализации C могут не поддерживать это: stdout
может быть макросом, который не поддерживает назначениек.( См. Страницу стандартных потоков руководства glibc .)