检测停止进程Python

时间:2014-10-21 11:02:08

标签: python c linux

我有一个C程序。我希望它在特定点运行和停止,让python脚本在停止时做一些事情。

我所做的是将这一行放在C程序的停止点:

kill(getpid(), SIGSTOP);

如果我的python代码有这一行:

subprocess.call("./prog");

它永远停滞不前,因为C程序永远不会被终止。

如果我使用它:

subprocess.Popen("./prog");

它在代码部分完成之前恢复。

如何检查子进程是否已停止? 还是有其他解决方案吗? 保持C程序正常运行对我来说非常重要。

谢谢你, 码头

2 个答案:

答案 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程序将看不到任何输出。