Если вы посмотрите на ссылку /proc/$PID/fd/0
, вы увидите, что она указывает на терминал:
# ls -l /proc/11962/fd/0
lrwx------ 1 foo users 64 Aug 15 04:30 /proc/11962/fd/0 -> /dev/pts/15
Когда вы выводите на него, вы не передаете ввод процессу nc
, вы выводите на терминал. Который должным образом печатает то, что вы выводите.
Это выглядит так:
/proc/$PID/fd/$N <-------> [ ]
[ terminal ]
[ nc ] <--------------------> [ ]
Не так:
/proc/$PID/fd/$N
| |
[ ] <-----+ +------> [ ]
[ nc ] <--------------------> [ terminal ]
Если файловый дескриптор 0 процесса был открыт для файла, вы все равно ожидаете, что запись в /proc/$PID/fd/0
будет показана как входные данные для процесса или для перехода к открытому файлу?
lrwx------ 1 foo users 64 Aug 15 04:36 /proc/11994/fd/0 -> /tmp/testfile
Что делать echo foo > /proc/11994/fd/0
в этом случае?
Здесь то же самое. Когда процесс читает из fd, он считывает данные из файла. Но когда вы повторно открываете тот же файл для записи через /proc/$PID/fd/$N
, вы записываете в файл.
Вам потребуется использовать ioctl TIOCSTI или аналогичный механизм для заполнения данными во входном буфере терминала. См. tty _ioctl (4)
РЕДАКТИРОВАТЬ 08.01.2021...Все нижеизложенное было сделано для Handbrake v1.3.3. См. мой новый ответ для Handbrake v1.4.0
Я ответил на вопрос в GitHub, похожий на вопрос, который я задал, и подумал, что ответ будет лучше служить публике с похожими проблемами здесь, на stackexchange, вместо того, чтобы быть зарытым в тикет о проблеме github....https://github.com/HandBrake/HandBrake/issues/1072#issuecomment-865630524
Кроме того, наблюдаемые преимущества послужат тем, кто готов приложить усилия, и сэкономят им много времени на кодирование/транскодирование. Они могут оценить усилие после его выполнения, чтобы доказать утверждение.
Большая часть процедуры была выведена и проверена на основе заметок, описанных здесь...https://github.com/griff/HandBrake/blob/master/doc/BUILD-Linux
Как описано в приведенной выше ссылке, не рекомендуется использовать CFLAGS/CXXFLAGS для управления компиляцией или сборкой. Рекомендуется использовать встроенный -механизм конфигурации для установки флагов gcc.
КАК?
Ручной тормоз — это просто передний -конец МНОГО "кронтрибов". Чтобы увидеть, как создается каждый модуль contrib, вы можете использовать отчеты «создать» для каждого вклада в каталоге сборки или целевом каталоге, прежде чем создавать их.
Чтобы получить каталог сборки, вам нужно выполнить первоначальную настройку через...
$ ./configure --build=build --optimize=speed
если у вас его нет.
СОСТАВЛЯЙТЕ ОТЧЕТЫ
напр. Допустим, вы собираете HandBrake в папке с именем «build» (, как значение в команде configure выше ), затем:
$ cd./build
$ make report.help
AVAILABLE MAKEFILE VARS REPORTS
----------------------------------------------------------------
report.main global general vars
report.gcc global gcc vars (inherited by module GCC)
report.var usage: make report.var name=VARNAME
x265.report X265-scoped vars
x265_8.report X265_8-scoped vars
x265_10.report X265_10-scoped vars
x265_12.report X265_12-scoped vars
libdav1d.report LIBDAV1D-scoped vars
ffmpeg.report FFMPEG-scoped vars
libdvdread.report LIBDVDREAD-scoped vars
libdvdnav.report LIBDVDNAV-scoped vars
libbluray.report LIBBLURAY-scoped vars
nvenc.report NVENC-scoped vars
libhb.report LIBHB-scoped vars
test.report TEST-scoped vars
gtk.report GTK-scoped vars
pkg.report PKG-scoped vars
В каждой строке, в первом столбце выше, вы увидите каждый отчет. затем вы можете получить доступ к отчетам по
$ make <report_name>
Если вы замените <report_name>
нужным отчетом.
Важно отметить, что существует иерархия и наследование вышеперечисленного даже в каждом отчете.
report.gcc
можно взять за корень для флагов gcc.
В моем случае я решил настроить сборку с использованием «скорости» ранее...
$ ./configure --build=build --optimize=speed
Что соответствует
GCC.args.O.speed
вreport.gcc
Другим важным ключом в этом отчете является
GCC.args.extra
, которые в основном «могут» добавлять дополнительные флаги опций компилятора после первого. Как вы знаете, в gcc, если есть конфликт между опциями, используется последняя. Поскольку мы не можем достаточно легко сказать, используют ли многие модули один, другой или оба, я стараюсь убедиться, что все, что есть в первом, также есть и во втором. Но последний может содержать больше! Вы можете увидеть значения по умолчанию, проверив отчет.
Вы можете переопределить вышеуказанное, создав текстовый файл конфигурации с именем « custom.defs » в корне исходной папки ручного тормоза (, если вы клонировали его с помощью git, а затем в верхнюю папку HandBrake, где вы в основном выполняете свои команды git pull ).
/HandBrake$ ls -h
AUTHORS.markdown CODE_OF_CONDUCT.md CONTRIBUTING.md download gtk macosx pkg scripts THANKS.markdown
build configure COPYING gccFDO libhb make preset SECURITY.md TRANSLATION.markdown
build2 contrib custom.defs graphics LICENSE NEWS.markdown README.markdown test win
ФДО (он же ПГО)
Я выполняю FDO (обратную связь -Directed Optimization aka FDO aka PGO -Profile Guided Optimization )в моем, поэтому я обычно сначала строю с custom.defs
, определяемым как
$ cat custom.defs
GCC.args.O.speed = -march=native -O3 -pipe -fprofile-generate=../gccFDO -fprofile-update=atomic
GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -fprofile-generate=../gccFDO -fprofile-update=atomic
Затем запустите HandBrake для перекодирования нескольких видео с различными кодеками, фильтрами и настройками; за пару дней на генерацию профилей. Затем я использую сгенерированные профили с помощью...
$ cat custom.defs
GCC.args.O.speed = -march=native -O3 -pipe -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
в новом каталоге сборки. Хорошими обычными подозреваемыми для профилирования будут типичные исходные типы для вашего типичного целевого типа кодирования. Мой типичный целевой тип — x265 _10 бит со звуком AAC :
.Как вы понимаете, в зависимости от вашего оборудования это может занять некоторое время! Мое профилирование заняло неделю!
Вы можете точно настроить флаги компилятора и оптимизацию для каждого модуля, используя процесс создания отчетов, который я описал выше для каждого модуля, и переопределив ключи, заключив их в кавычки в файле custom_defs
с нужными вам значениями, как в примере выше. для значений по умолчанию GCC.args.*
.
Чтобы все вышеперечисленное работало, не забудьте не экспортировать CFLAGS или CXXFLAGS. Вы можете проверить, какие флаги вы установили в сеансе bash, с помощью:
$ export -p | grep FLAGS
LTO + FDO:
Оптимизация времени соединения LTO и FDO отлично сочетаются друг с другом, поскольку их можно легко найти в Google для многих программ и тестов.
К сожалению, при установке LTO по умолчанию в GCC.args.*
с помощью -flto
или установке LTO для модуля FFMPEG; сбой всей сборки. Это логическое «или». Он потерпит неудачу на одном или другом или на обоих!
Однако LTO можно добавить ко всем остальным модулям!
Это мой custom.defs
...
$ cat custom.defs
GCC.args.O.speed = -march=native -O3 -pipe -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265_8.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265_8.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265_10.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265_10.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265_12.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265_12.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBHB.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBHB.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBDAV1D.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBDAV1D.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
GTK.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
GTK.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBDVDREAD.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBDVDREAD.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBDVDNAV.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBDVDNAV.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBBLURAY.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBBLURAY.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
TEST.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
TEST.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
NVENC.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
NVENC.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
РЕДАКТИРОВАТЬ 08.01.2021... Все вышеперечисленное было сделано против Handbrake v1.3.3 .
Описанный выше процесс не удался для версии 1.4.0 Пожалуйста, смотрите мой другой ответ для v1.4.0.