检测Python中的停止进程
我有一个C语言的程序。我希望它能在特定的地方暂停,然后让一个Python脚本在暂停时执行一些操作。
我在C程序的暂停点加了这一行:
kill(getpid(), SIGSTOP);
如果我的Python代码里有这一行:
subprocess.call("./prog");
那么它就会一直卡在那儿,因为C程序没有结束。
如果我用这个:
subprocess.Popen("./prog");
那么在代码部分还没执行完之前,它就会继续运行。
我该如何检查子进程是否已经暂停?或者有没有其他的解决办法?保持C程序运行对我来说非常重要。
谢谢,
Marina
2 个回答
0
我不知道你想要做什么。如果你想检查一个子进程的状态,可以使用 Popen.poll()
;如果你想等它停止,可以用 Popen.wait()
。
或者你是想定期检查它的状态?如果是这样,可以试试 threading.Timer()
。
0
为了让你的Python脚本和子进程C程序的执行保持同步,你可以使用一些通信方式。例如,在C程序中,你可以在想要暂停的地方写一个字节到标准输出,代码是putchar('\0')
。这样C程序就会停下来等着,而Python可以在这段时间内做一些事情。然后,C程序可以用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);
否则,Python程序在你明确调用fflush()
之前,可能看不到任何输出,或者直到缓存满了才会看到。