Когда выполняется системный вызов, происходит переключение привилегий, т.е. выполняемому коду разрешается выполнять больше инструкций и получать доступ к данным, запрещенным для пользовательского кода.
Однако не происходит переключения контекста процесса, поэтому код ядра по-прежнему выполняется в контексте вызывающего процесса. Это означает, что ядру не нужно искать, какой процесс его вызывает, оно уже знает это. Код системного вызова getpid просто извлекает идентификатор процесса из указателя на внутреннюю структуру, содержащую специфическую для процесса/потока информацию. Эта структура зависит от реализации операционной системы.
Например, в Illumos (OpenSolaris) структура называется proc: http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/sys/proc.h#131
Здесь вы можете использовать только awk
.
awk 'NR==FNR{a[$1]++; next} ($1 in a) {sum+=$4} END{print sum}' file1.txt file2.txt
Причина, по которой это не работает так, как вы написали, заключается в том, что awk
будет интерпретировать $i
как "i
-е поле", а поскольку awk
переменная i
не имеет значения, вы будет получено сообщение об ошибке, или если вы используете GNU awk
или mawk
, $i
будет таким же, как $0
, то есть вся строка (с mawk
или GNU awk
, программа ищет строки, первый столбец которых совпадает со всей строкой ).
Вместо этого, чтобы «импортировать» вашу переменную оболочки вawk
:
awk -v i="$i" '$1 == i { sum += $4 } END { print sum }' test2.txt
Кроме того, значение переменной оболочки $i
всегда будет только именем файла test1.txt
(, так как это то, что вы перебираете в цикле ).
Циклический просмотр содержимого файла:
while IFS= read -r i; do
awk...as above...
done <test1.txt
Ответ αғsнιη показывает, как это можно сделать без использования цикла оболочки.