我编写了一个简单的调试程序,可以执行控制台程序并将其输出发送到“out”和“err”文件,并从“in”文件中检索其输入。现在,我想扩展其功能以运行Python脚本。要做到这一点,我想我可以让调试器只运行Python解释器,只需将Python解释器与文件接口。
但是当我在调试器中运行Python解释器时,我看不到像普通程序那样的输出。调试器有非常详细的错误记录,我没有在错误日志文件中看到任何错误。
我使用了“ps -A”,看起来调试器启动了Python解释器有两个原因:1)进程ID不同于1和2)调试器在我杀死-9 python后立即退出解释器(表示文件描述符已连接)。这是ps -All的输出:
1 R 0 1565 1 88 80 0 - 1040 - pts/0 00:01:45 debugger
0 S 0 1566 1565 0 80 0 - 7782 pipe_w pts/0 00:00:00 python.out
调试器就像这样启动(python.out是python解释器的副本):
debugger python.out
所以我想我的问题是,有谁知道为什么这不起作用? Python解释器对标准文件描述符做了什么奇怪的事吗?
编辑:
我还注意到python.out无法使用python.out>重定向其IO。 out_file - 可能与调试器所遇到的问题有关,也可能与之无关。
调试器不使用块缓冲。
以下是来自/ proc / pid / io的一些io信息:
调试器(我将一些长度为21的数据写入“in”文件中)
rchar: 21
wchar: 21
syscr: 300222462
syscw: 1
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0
Python解释器
rchar: 517268
wchar: 0
syscr: 93
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0
答案 0 :(得分:2)
Python解释器的pipe_w
等待状态是赠品:它无法运行,因为它试图从空管读取或写入完整管道。
在您的代码或解释器中或两者中都使用了块缓冲,并且您没有向我们展示足以告诉我们哪个。
在回复评论时添加:
您认为自己不是块缓冲,但stdio库可能会在您不知情的情况下执行此操作。考虑一下简单:
main()
{
puts("print ('hello, world!')\n");
sleep(3600);
}
当您从终端运行此程序时,它会在终端上打印print ('hello, world!')
,然后按照您的预期睡眠一小时。那是因为stdio库检测到stdout
是一个终端,并且在每个换行符上都有write()
的缓冲区。这样做是因为人们喜欢在准备就绪时看到行缓冲输出。但是,如果将此程序的输出传送到python
,则终端上将不会显示任何内容一小时;这是因为stdio库看到stdout
是一个管道并切换到阻止缓冲模式。在块缓冲模式下,stdio将等待,直到它有BUFSIZ
个字符要写,而在现代机器BUFSIZ
上则为4096或更高。
当你说“我可以确认调试器正在读取我传递给它的输入”时,由于这种模式切换stdio,你在终端上测试你的调试器实际上并没有告诉你进程间通信是否是缓冲与否。 ps
的输出表明它正在缓冲。有关如何控制缓冲的信息,请参阅setvbuf。
或者您可以显示您的代码而不是无用的/proc/n/io
。我的python
报告:
rchar: 288789
wchar: 0
syscr: 108
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0
但它仍然没有给出任何输出,直到小时结束才会显示,因为/proc/n/wchan
是
pipe_wait
正如所料。