使用PIPE从主进程读取子进程的stdout,导致子进程死亡。

问题描述 投票:0回答:1

我有一个简单的代码。

proc = subprocess.Popen(["/home/root/cc6ul/./IQ-sampler", str(self.num_files), str(self.n), self.results_directory, self.device_id, self.rid, self.cc6ul_state_filepath], stdout=subprocess.PIPE)

while proc.poll() is None:
    line = proc.stdout.readline()
    self.log.info("line:{}".format(line))

这导致我的IQ -采样器进程在时间之前死亡。但如果我直接从终端运行它,它就没有问题。我试着调试了一下,但我不明白根本原因。是通信PIPE的问题吗?因为这是我能看到的2个进程之间的唯一连接。

python subprocess pipe stdout popen
1个回答
0
投票

经过大量的调试,问题似乎出在IQ-sampler linux C语言的定时器回调上,它使用的是SIGEV_THREAD线程通知。将定时器回调加入到关键部分使用锁,似乎解决了这个问题。

有趣的是,只有当其他进程(这里是主python进程)运行时,IQ-sampler才会死亡,这让我认为CPU的负载可能加剧了并发问题。


-1
投票

如果这个命令在终端上可以工作,那么你可以简单地通过输入 shell=True 和实际的命令到Popen函数中。这样做的结果应该和在shell上执行命令的结果完全一样。

© www.soinside.com 2019 - 2024. All rights reserved.