Как послать SIGINT через терминал? В инете вычитал что достаточно отослать ^C и всё заработает, но это не так. Код (под вторым питоном тоже работает):
#!/usr/bin/env python3
from __future__ import print_function
import shlex
import time
import pty
import os
def osexec(cmd):
cmd = shlex.split(cmd)
os.execlp(cmd[0], *cmd)
pid, fd = pty.fork()
if pid == 0:
osexec('perf stat -x, sleep 10')
time.sleep(1)
os.write(fd, b'^C')
raw_data = os.read(fd, 65535)
print("OUT:",raw_data.decode())
Ожидаемый вывод:
sleep: Interrupt
1.260884,task-clock
1,context-switches
0,cpu-migrations
...
Попой чую нужен какой-нить ioctl. Почему я не делаю просто kill -INT: похоже что грёбаный perf различает сигналы от терминала и от юзера (по SI_KERNEL|SI_USER) и ведёт себя по-разному. Отсюда и костыли в коде с эмуляцией терминала вместо subprocess.Popen.