首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用按钮杀伤子进程

如何用按钮杀伤子进程
EN

Stack Overflow用户
提问于 2013-07-19 10:32:06
回答 3查看 1.8K关注 0票数 1

我在Raspberry Pi上使用开放式照明架构,我需要能够用一个按钮开始一个不断循环运行的节目,然后杀死那个节目,然后用一个按钮开始另一个节目。我使用的是有4个按钮的pyface插件。我可以启动一个进程,但是我不能用按钮杀死一个进程。

如果您在命令行中使用ola,则可以通过按control-c来停止显示。我已经能够用tkinter做一个可以停止进程的gui,但同样的过程不能用物理按钮来完成。

代码语言:javascript
复制
    from time import sleep
    import os
    import signal
    import piface.pfio as pfio
    import time
    import threading 
    from subprocess import Popen
    import subprocess
    import Queue

    pfio.init()
    pfio.digital_read(0)
    pfio.digital_read(1)
    pfio.digital_read(2)

    def olaserverStart ():
      os.system('olad -l 3')

    def show1():
        os.system('ola_recorder -p /home/pi/Mermaid -i 0')

    def stop():
        try:
            sig = signal.CTRL_C_EVENT
        except AttributeError:
            sig = signal.SIGINT
        send_signal(sig)

    def universe():
      global proc3
      proc3 = subprocess.Popen('ola_patch -d 12 -p 0 -u 0', shell=True)
      proc3.wait()

    def universe1():
        global proc4
        proc4 = subprocess.Popen('ola_patch -d 6 -p 0 -u 0', shell=True)
        proc4.wait()


    olaserverStart()
    universe()
    universe1()



  while True:
        if (pfio.digital_read(0) == 1):
                p3 = subprocess.Popen('ola_recorder -p /home/pi/Mermaid -i 0', shell=True)
                p3.wait()
        if (pfio.digital_read(1) == 1):
          try:
            sig = signal.CTRL_C_EVENT
          except AttributeError:
            sig = signal.SIGINT
          p3.send_signal(sig)
        if (pfio.digital_read(2) == 1):
                os.system('ola_recorder -p /home/pi/Mermaid -i 0')
        sleep(0.15);
EN

回答 3

Stack Overflow用户

发布于 2014-03-14 17:22:43

当我使用send_signal时,它也不工作。我不知道why.So我试图使用os.kill来杀除子进程。

代码语言:javascript
复制
pp = subprocess.Popen("ping www.google.com",stdin = subprocess.PIPE,stdout =            subprocess.PIPE,stderr = subprocess.PIPE,shell = True)
os.kill(pp.pid+1,signal.SIGTERM)
票数 0
EN

Stack Overflow用户

发布于 2014-03-15 03:47:53

代码中的p3.wait()会阻止循环,直到子进程结束。如果你删除了它,那么你可以调用:

代码语言:javascript
复制
if p.poll() is None:
   p.terminate()
   p.wait()

来终止进程。

os.system()也会一直阻塞,直到子进程结束。您可以将其替换为:

代码语言:javascript
复制
subprocess.Popen('ola_recorder -p /home/pi/Mermaid -i 0'.split())

只要ola_recorder启动,它就会立即返回,而不需要等待它退出。

为了避免僵尸,你需要调用p.wait() (阻塞)或p.poll() (不阻塞)。您应该调用later,直到它返回非None值(表示子进程退出)。

票数 0
EN

Stack Overflow用户

发布于 2014-03-17 09:03:49

我又试了一次。它可以终止进程。当我这样做的时候

代码语言:javascript
复制
pp = subprocess.Popen("ping www.google.com", stdin=subprocess.PIPE, stdout= subprocess.PIPE,stderr = subprocess.PIPE,shell = True)

它确实有两个过程。/bin/sh -cping。当我尝试terminate()时,它会杀死/bin/sh -c。因此ping命令仍在运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17737222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档