Должен ли я использовать ждать попен - PullRequest
0 голосов
/ 06 сентября 2018

Я использую функцию subprocess.Popen в playStation для запуска другого процесса, который является медиаплеером для воспроизведения радиостанции. Однако, когда я убиваю родительский процесс, он не останавливается, не убивается. Просто застрял после нажатия CTRL-C, CTRL-Z или отправки SIGKILL. Обычно, он должен быть убит немедленно. Но нет.

Я чувствую, что точно совершил ошибку или несколько ошибок. Один из них, может быть, я не думаю ждать медиаплеера, которым управляет subprocess.Popen, так как он воспроизводит радиостанцию, пока я не убью ребенка. мне ждать? Если да, то как, где?

Если я подожду до return p, он застрянет.

Я пытаюсь упростить мой код,

def playStation(stationAddress):
    # if there is a media player being run, kill it for new one
    killMPlayer = "killall mplayer"
    os.system(killMPlayer)

    radioName = 'mplayer ' + '-playlist ' + stationAddress
    p = subprocess.Popen(radioName.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    ## the return value is not used I have added it ,maybe necessary
    return p


arr = [ 
        'radio ip address:port 1',
        'radio ip address:port 2',
        'radio ip address:port 3',
        'radio ip address:port 4',
        .
        .
        .
        .
        .
        there are more but just simplicity 4 is enough
]

counter = 0

try:
    while True:
        signal.signal(signal.SIGCHLD, signal.SIG_IGN)

        pid = os.fork()


        if pid == 0:

            playStation(arr[counter])

            ### normally playStation does work, control is takeovered by '''mplayer''' !!!!
            exit(0)
        else:
            ### wait until rotary encoder(switcher) is turned
            GPIO.wait_for_edge(CLOCKPIN, GPIO.FALLING)
            sleep(0.5)

            ### stop current child to create new child
            ### stop currently playing radio station to change to new station

            os.kill(pid, signal.SIGTERM)
            #os.waitpid(pid, 0)

            # prevent index out of bound
            if rotary_encoder_turned_left:
                counter = counter - 1
                if counter < 0:
                    counter = 4
            elif rotary_encoder_turned_right:
                counter = counter + 1
                if counter > 4:
                    counter = 0
...