Помещение замещенного файлового дескриптора процесса в переменную

Как всегда, прочитайте руководство. Ответ на это и оставление на виду его для помощи другим, которые могут столкнуться с этим. На проект документации Linux я использовал obj-m неправильно:

Иногда имеет смысл делить модуль ядра между несколькими исходными файлами. Вот пример такого модуля ядра.

[Исходные файлы...]

И наконец, make-файл:

Пример 2-10. Make-файл

obj-m + = привет-1.o obj-m + = привет-2.o obj-m + = привет-3.o obj-m + = привет-4.o obj-m + = привет-5.o obj-m + = startstop.o стартстопный-objs: = start.o stop.o

все: сделайте-C/lib/modules/, $ (окружите uname-r)/, создают $ M= (PWD) модули

чисто: сделайте-C/lib/modules/, $ (окружите uname-r)/, создают $ M= чистый (PWD)

Руководство по программированию модуля ядра Linux: 2.7. Модули, охватывающие несколько файлов

Так, мой Make-файл должен был читать:

obj-m += kexecmod.o
kexecmod-objs := kexec.o machine_kexec.o relocate_kernel.o

Который скомпилировал relocate_kernel. S в relocate_kernel.o

(Любому спотыкающемуся через эту попытку скомпилировать kexec как модуль, я все еще не нашел все зависимости, но это - запуск.)

4
29.09.2015, 01:01
2 ответа

Вместо того, чтобы называть результаты, вы можете просто назвать команду.

param_set_1(){
    input_command \
        -lots     \
        -of       \
        -params
}
param_set_2(){
    input_command \
        -lots     \
        -of       \
        -other    \
        -params
}

command_outer -params <(param_set_1) <(param_set_2)

Вы также можете часто ссылаться на файловые дескрипторы по имени.

param_set_1 | { param_set_2 | command_outer -params /dev/fd/3 -; } 3<&0

Если вам действительно нужны результаты в переменной текущей оболочки и в файловом дескрипторе, то вам следует держаться подальше от конвейеров. Вы рискуете заполнить буфер канала выводом своей команды, одновременно пытаясь назначить эти результаты переменной родительской оболочки до того, как буфер канала будет очищен процессом чтения и ... ну, это некрасиво. Итак, вы должны взять все это за один раз и использовать здесь-документы.

unset fd3 fd4
{   command_outer -params /dev/fd/[34]
}   3<<FD3 4<<FD4
${fd3=$(param_set_1)}
FD3
${fd4=$(param_set_2)}
FD4
9
27.01.2020, 20:47

Вы можете явно использовать именованные трубы (которые, я думаю, подстановка процессов действительно использует в деталях):

trap cleanup EXIT
cleanup() { rm -f "$inner1" "$inner2"; }

inner1=$(mktemp -u) && mkfifo "$inner1"
command-inner "again long params" > "$inner1" &

inner2=$(mktemp -u) && mkfifo "$inner2"
command-inner "again long params" > "$inner2" &

command-outer "long ... $inner1...  $inner2 ..."
3
27.01.2020, 20:47

Теги

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