首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Linux中交互式地打开和关闭输出?

在Linux中交互式地打开和关闭输出?
EN

Stack Overflow用户
提问于 2016-08-03 04:45:44
回答 1查看 70关注 0票数 1

用于在Linux上控制输出的有control-s和control-t,它们提供了一种临时停止终端输出然后恢复输出的方法。在VMS上,另外还有control-O,它可以打开和关闭所有输出。这并没有暂停输出,而是将其丢弃。

在Linux中有没有等效的键盘快捷键?

在gdb中,这是我在调试输出数百万个状态行的程序时最常遇到的问题。如果能够暂时将大部分内容发送到/dev/null而不是屏幕,然后在两个屏幕之间省去两百万行代码,然后再继续输出流,这将非常方便。

(编辑: termios(3)手册页提到了VDISCARD -然后又说它在POSIX或Linux上不能工作。因此,对于linux上的一般命令行使用,这看起来是不可能的。不过,gdb仍然可以通过它自己的命令之一丢弃输出。可以吗?)

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-08-04 12:49:30

虚拟机上的

另外还有control-O ...

这个功能似乎并不存在于我接触过的任何UNIX系统上(或者我只是从来不知道它的存在;它在FreeBSD man page等文档中有说明,在Solaris和HP-UX文档中也有引用)。

不过,

gdb仍然可以通过它自己的命令之一丢弃输出。可以吗?

我不这样认为: GDB实际上并不截获来自次等(被调试)进程的输出,它只是让它运行(在断点之间),并将次等输出带到它要去的任何地方。

也就是说,你可以自己做:

代码语言:javascript
运行
复制
#include <stdio.h>
int main()
{
  int i;
  for (i = 0; i < 1000; ++i) {
    printf("%d\n", i);
  }
}

gcc -g foo.c
gdb -q ./a.out

(gdb) break 6
Breakpoint 1 at 0x40053e: file foo.c, line 6.

(gdb) run 20>/dev/null    # run the program, file descriptor 20 goes to /dev/null

Starting program: /tmp/a.out 20>/dev/null

Breakpoint 1, main () at foo.c:6
6       printf("%d\n", i);
(gdb) c
Continuing.
0

Breakpoint 1, main () at foo.c:6
6       printf("%d\n", i);

我们现在已经运行了两次迭代。让我们阻止100次迭代的进一步输出:

代码语言:javascript
运行
复制
(gdb) call dup2(20, 1)
$1 = 1
(gdb) ign 1 100
Will ignore next 100 crossings of breakpoint 1.
(gdb) c
Continuing.

Breakpoint 1, main () at foo.c:6
6       printf("%d\n", i);
(gdb) p i
$2 = 102

如所需,无输出。现在让我们恢复输出:

代码语言:javascript
运行
复制
(gdb) call dup2(2, 1)
$3 = 1
(gdb) ign 1 10
Will ignore next 10 crossings of breakpoint 1.
(gdb) c
Continuing.
102
103
104
105
106
107
108
109
110
111
112

Breakpoint 1, main () at foo.c:6
6       printf("%d\n", i);

输出已恢复!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38730133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档