我有一个C程序。我希望它在特定点运行和停止,让python脚本在停止时做一些事情。
我所做的是将这一行放在C程序的停止点:
kill(getpid(), SIGSTOP);
如果我的python代码有这一行:
subprocess.call("./prog");
它永远停滞不前,因为C程序永远不会被终止。
如果我使用它:
subprocess.Popen("./prog");
它在代码部分完成之前恢复。
如何检查子进程是否已停止? 还是有其他解决方案吗? 保持C程序正常运行对我来说非常重要。
谢谢你, 码头
答案 0 :(得分:0)
我不知道你的目的是什么,如果你想检查子流程'状态,使用Popen.poll()
,如果您想等待它停止,请使用Popen.wait()
。
或者您需要定期检查其状态?如果是,请尝试threading.Timer()
。
答案 1 :(得分:0)
要将Python脚本的执行与子C进程同步,您可以使用通信,例如,在C程序中将字节写入您希望它停止的地方的putchar('\0')
并等待Python执行尝试回读一个char getchar()
以继续执行,并在Python脚本中反向执行:读取一个字节,开始执行某些操作,并将字节写入信号C程序以继续:
from subprocess import Popen, PIPE
# start child process, do not block Python
p = Popen("./prog", stdin=PIPE, stdout=PIPE, bufsize=0)
while p.poll() is None: # while C program is running
# block here until C program writes a byte and flushes its stdout buffer
if not p.stdout.read(1): # EOF
break
# .. do something while C program waits
p.stdin.write(b'\0') # signal C program to continue
要在C中取消缓冲标准输出,请在C程序的最开头调用:
setvbuf(stdout, NULL,_IONBF,0);
否则,在您明确调用fflush()
或相应的缓冲区溢出之前,Python程序将看不到任何输出。