Я использую функцию 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