Очистить буферы pipe/printf извне для уже запущенного процесса с известным PID

awk '{sub(/^#/,"")sub(/#/," &");print $1}' file

abc
nrt
clb1aX
amd
2
10.06.2019, 12:28
2 ответа

Есть ли у вас доступ к исходникам запущенных программ?

Принудительная очистка произвольного исполняемого файла, хотя теоретически и не невозможна, очень сложна. Вам нужно будет найти в коде функцию fflushи аргумент stdout, затем прервать выполнение программы, организовать вызов fflush, затем продолжить выполнение. Если программа использует разделяемую библиотеку, это, по крайней мере, упрощает первую часть, поиск fflushи stdout, но вам все равно нужно смоделировать вызов. Кроме того, для неизвестного двоичного файла вы не можете знать, использовал ли он stdio или реализовал свой собственный механизм буферизации. Знание пути к выходному файлу вам не поможет.

Вы можете попробовать использовать gdb, затем использовать команду attachдля подключения к процессу. Возможно, gdbможет вызвать функцию fflush.

Если у вас есть исходный код программы, реализуйте обработчик сигналов, который очищает буфер и просто отправляет сигнал, когда вы хотите очистить буфер.

Вы можете попробовать канал, возможно, программы не буферизуются, если вывод является каналом. Измените его на

./program | your_program > out.bin

Ваша программа может принимать ввод, буферизовать его и очищать буфер при получении сигнала. Это все равно добавит нагрузку на ЦП, но не на диск.

4
27.01.2020, 21:55
gdb -p PID -batch -ex 'p fflush(stdout)'

Как и при любой отладке и взломе, YMMV.

4
27.01.2020, 21:55

Теги

Похожие вопросы