Хитрость заключается в том, чтобы сопоставить что-то в конце строки, например последний токен, разделенный пробелом -в этой строке, а затем повторно -записать эту строку в двойных -кавычках вокруг этого токена.
Эта команда сделает это:
sed -E 's/^(AUXDATA.*) ([^ ]*)$/\1 "\2"/' < foo
Опция -E
сообщает sed, что мы будем использовать расширенный синтаксис регулярных выражений.
Само регулярное выражение разбивает строку на две части:
Часть, которая имеет AUXDATA
в начале строки (^
, указывает на начало строки ), за которой следует произвольный текст, заканчивающийся пробелом
часть строки, которая не содержит пробелов и заканчивается в конце строки
В частности, в этом случае первая часть соответствует AUXDATA Zone_1_X =
, а вторая часть соответствует 28.180958
. sed
затем заменяет эту строку на:
\1
пробел после \2
и еще одна двойная -кавычка. Все остальные строки входного файла передаются без изменений с помощью sed
.
Ни для родителя, ни для потомка не требуется помещать любой pid в память другого.
В момент разветвления перед ядром стоит задача дублирования всего пространства процесса родителя (, что может быть достигнуто без полной копии, например, путем первоначального дублирования записей таблицы страниц в некоторую память ).
Ядро во время любого системного вызова может передать возвращаемое значение из вызова, исправив стек пользовательского процесса, прежде чем вернуть его в пользовательский режим. Вот откуда берутся все возвращаемые значения системных вызовов.
Для ядра абсолютно не проблема исправить два кадра стека с разными значениями для родителя и дочернего элемента. Ни один из процессов не выполняется, они оба находятся в системном вызове, поэтому кадр стека хорошо -определен, и ядро может получить доступ ко всей памяти.