C - Получить PID процесса, открытого с помощью popen - PullRequest
3 голосов
/ 27 февраля 2012

У меня есть программа, написанная на C, которая открывает другую программу, используя popen. Я хотел бы получить pid этой программы или какой-то другой обработчик для нее, чтобы убить ее через определенный промежуток времени, или если он превышает некоторый предел оперативной памяти и ограничения stdout. Я думаю, что это должно быть сделано с ptrace, которому нужен PID, который я не знаю, как получить.

Ответы [ 2 ]

6 голосов
/ 27 февраля 2012

Просто напишите свою собственную реализацию popen, которая возвращает PID.Это гораздо менее уродливо, чем какое-то безумное хакерство вокруг существующего popen.Вы можете найти исходный код для popen реализаций по всей сети. Вот один .

0 голосов
/ 27 февраля 2012

Вы также можете использовать ulimits и другие приемы для достижения желаемой функциональности без использования ptrace.Вы можете сделать это, написав свою команду как нечто похожее на "sh -c 'ulimit [ulimit strings]; whatever-command'".ulimit -v заботится об ограничении оперативной памяти.Ограничение времени процессора (ulimit -t) может приблизиться к ограничению времени;если нет, и если вы готовы переписать popen, то можете вставить туда звонок setitimer.стандартный вывод менее прост;но если вы регистрируете стандартный вывод с перенаправлением оболочки, то я думаю, ulimit -f сделает это.Если вы читаете stdout ребенка в родительском приложении, вы можете отследить его самостоятельно и убить сигналом, если он слишком длинный.

...