【问题标题】:Linux terminal: carriage return stuck at line wrapLinux终端:回车卡在换行处
【发布时间】:2017-06-12 12:15:17
【问题描述】:

我在远程 Linux 服务器上运行 c++ 代码,通过 MobaXterm 访问。该过程需要一段时间并且是多线程的,因此我添加了一个进度打印机制,如下所示:

void update_progress() {
    omp_set_lock(&lock);
    string progress = get_threads_progress();
    cout << "\rProgress " << progress;
    omp_unset_lock(&lock);
}

使用三个线程,它可能看起来像这样:

Progress | 23/100 | 42/100 | 89/200

回车在那里,所以我可以在一行中看到作业的进度。在 48 核机器上运行我的代码时问题开始了:进度 字符串对于终端来说太长,行环绕,回车仅将光标设置回当前行的开头。例如:

// Several threads run this in parallel
for (int i=1; i<=5; ++i) {
    update_progress();
}

我会得到类似以下的输出:

Progress | 23/100 | 41/100 | 86/100 | 19/100 | 3/100 | 97/100 | 54/1 
Progress | 23/100 | 42/100 | 86/100 | 19/100 | 3/100 | 97/100 | 54/1 
Progress | 23/100 | 42/100 | 86/100 | 20/100 | 3/100 | 97/100 | 54/1 
Progress | 23/100 | 42/100 | 87/100 | 20/100 | 3/100 | 97/100 | 54/1 
00 | 23/100 | 21/100

我假设回车 \r 应该成功地将光标放回 Progress 中的 P,而不管终端宽度如何......

我错了吗?如果是这样,我如何(如果可能)得到我想要的?如果不是,那是什么问题?

【问题讨论】:

    标签: c++ linux terminal openmp carriage-return


    【解决方案1】:

    回车不是在您的程序或标准库中处理,而是由显示文本的终端程序处理。它只转到 current 行的开头,即光标当前所在的行,如果有换行,则不是上一行的开头。因此,请确保您打印的文本根本不足以导致换行。

    【讨论】:

    • 有什么我可以做的吗?是否有可以设置为支持\r 行为的终端?如果是这样,它们中是否有任何用于 Windoze 的 SSH GUI?这项工作可以运行几天,我真的需要在一行上并行输出,这样我仍然可以看到以前的进度..
    【解决方案2】:

    在 Putty 中可以关闭自动换行模式:

    Settings -> Terminal -> [ ] Auto wrap mode initially on
    

    该设置默认开启。关闭它会禁用自动换行,而是保持线条不间断。这也意味着您只能从每条长线中看到窗口宽度允许的符号数量。因此,需要支持水平滚动的寻呼机,例如less,才能查看长行文本。

    或者在 GNU screen 会话中运行您的程序并使用 Ctrla:wrap 切换回绕模式。

    【讨论】:

      猜你喜欢
      • 2015-06-05
      • 2021-03-14
      • 1970-01-01
      • 2018-08-19
      • 2020-10-23
      • 2014-12-11
      • 1970-01-01
      • 2015-06-26
      • 2016-01-02
      相关资源
      最近更新 更多