【发布时间】:2015-07-05 01:06:54
【问题描述】:
我用 C 语言编写了一个简单的程序,它在缓冲区中接收一个字符串,然后以十六进制打印出缓冲区,如果在字符串中找到“\x04”,则 aborts():
#include <stdio.h>
#include <signal.h>
int main(void) {
unsigned char buf[16] = {0};
int i;
printf("Name: ");
fgets(buf, sizeof(buf), stdin);
for(i = 0; i < sizeof(buf); i++)
{
printf("0x%02x ", buf[i]);
if(buf[i] == 0x04)
kill(getpid(), SIGABRT);
}
printf("\n");
}
如果我通过管道传递程序的输出,则此方法有效,例如 perl -e '打印 "\x08\x08\x04\x08"' | ./fget-test
但是我使用 pexpect 得到了错误的输出: 0x54 0xd0 0x08 0x0a 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
似乎 0x04 似乎永远无法通过?
这是我用于 pexpect 的 python 代码:
#!/usr/bin/python2.7
import pexpect
import sys
import os
import io
print "\x54\xd0\x04\x08\x0a\x0a"
c = pexpect.spawn('./fget-test')
c.setecho(False)
c.maxsize = 1
c.expect('Name:')
os.write(1, (b"\x54\xd0\x04\x08\x0a"))
os.write(c.fileno(), (b"\x54\xd0\x04\x08\x0a"))
print c.readline()
为什么在使用 pexpect 时 \0x04 永远不会成功?我意识到我可以使用 subprocess.Popen 但在这种情况下我不能,因为它是一个大型程序的小测试用例,可以帮助诊断实际发生的情况。当将 pexpect python 程序传送到 xxd 时,我可以清楚地看到“0x04”通过。
【问题讨论】:
-
你应该使用
c.sendline()而不是os.write(c.fileno()) -
在这种情况下,c.write(c.fileno(), ..) 用于测试行为是否特定于 c.sendline() 或者是否无关紧要。 os.write() 被留下,因为我使用哪个并不重要,行为是一样的。
-
是的。它不会改变结果(这就是为什么我将其发布为评论而不是答案)。您应该使用
pexpect提供的.sendline()API,该API 与其他pexpect部件一起使用。
标签: python-2.7 pexpect