如何防止 Expect 输出 CRLF?

问题描述

它来自操作系统分配,为 Xv6(https://github.com/remzi-arpacidusseau/ostep-projects,initial-xv6) 添加系统调用。我确保我的代码正确并且环境设置好,但就是无法通过测试。运行 diff 返回

1c1
< XV6_TEST_OUTPUT 200000
---
> XV6_TEST_OUTPUT 200000

使用 od 我发现答案应该使用 \n 作为换行符,而在我的输出中,它是 \r\n

我花了很多时间来说明 \r 不是由 Xv6 中的 printf 或 qemu 引入的。测试是使用 Expect 脚本完成的,这就是我认为可能有问题的地方。

我发现了一个相关的问题,但似乎没有给出可行的解决方案: Where does the \r come from?

这个问题似乎不常见,我的大多数同学都可以通过测试。所以我想知道如何防止 \r 输出

期望脚本:

#! /usr/bin/env expect

proc shutdown {} {
    # send command to halt qemu (ctrl-a x)
    # https://stackoverflow.com/questions/27050473/how-to-send-ctrl-a-then-d-in-expect
    send "\x01"; send "x"
    # make sure to wait for it all to stop
    # (without this,script was terminating before qemu quit -> bad)
    expect eof
}

# turn off timeout (perhaps make this flexible later)
set timeout -1

# build and launch xv6 on qemu
spawn make [lindex $argv 0] -f [lindex $argv 1] qemu-nox

trap {
    shutdown
    exit 0
} SIGINT

# wait for initial prompt
expect "init: starting sh\r"
expect "$ "

# send command as per command line
send "[lindex $argv 2]\r"

# wait for it to be done
expect "$ "

# shutdown qemu properly (avoid runaways)
shutdown

运行测试的命令:

cd src; ../../tester/run-xv6-command.exp cpuS=1 Makefile.test test_1 | grep XV6_TEST_OUTPUT; cd ..

test1.c

#include "types.h"
#include "stat.h"
#include "user.h"

int
main(int argc,char *argv[]) {
  int x1 = getreadcount();
  int x2 = getreadcount();
  char buf[100];
  (void) read(4,buf,1);
  int x3 = getreadcount();
  int i;
  for (i = 0; i < 1000; i++) {
    (void) read(4,1);
  }
  int x4 = getreadcount();
  printf(1,"XV6_TEST_OUTPUT %d %d %d\n",x2-x1,x3-x2,x4-x3);
  exit();
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...