我在C中编写了一个简单的程序,它接收缓冲区中的字符串,然后以十六进制打印出缓冲区,如果找到" \ x04"则中止()在字符串中:
#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&#39; print&#34; \ x08 \ x08 \ x04 \ x08&#34;&#39; | ./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时,我可以清楚地看到&#34; 0x04&#34;通过。
答案 0 :(得分:0)
似乎已经解决了这个问题。解决方案是导入tty,然后在文件描述符上调用tty.setraw。