Какой системный вызов создает родительский процесс?

Ваши условные команды неверны :[не просто синтаксис, это на самом деле команда . И, как и любой команде, ей нужен пробел, чтобы отделить ее от аргументов.

Нет

if [$l_var = "C"]

но

if [ "$l_var" = "C" ]
#..^........^.^...^   mandatory whitespace

Обратите внимание на добавление кавычек вокруг левой -переменной. Очень важный.


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

Самый простой способ — записать новое значение в файл, и когда фоновый процесс завершится (здесь поможет команда wait), вы можете прочитать значение из файла

#!/bin/bash
tmpfile=$(mktemp)
l_var='N';

func1() {
    l_var='C'
    # do some logic which will take time
    sleep 5
    echo "$l_var" > "$tmpfile"
    echo "$FUNCNAME complete"
}

func2() {
    l_var2='C'
    # do some logic which will take time
    sleep 1
    echo "$FUNCNAME: l_var2=$l_var2"
}

func3() {
    l_var3='C'
    # do some logic which will take time
    echo "$FUNCNAME: l_var3=$l_var3"
}

echo "start: l_var=$l_var"

#  call function1 and function2 parallaly
func1 &
func2

# wait for func1, then read the new value from the file
wait
l_var=$(< "$tmpfile")

echo "after func1, l_var=$l_var"

# once function1 one completed, then call function3
if [[ "$l_var" == "C" ]]; then
    func3
fi

выходы

start: l_var=N
func2: l_var2=C
func1 complete
after func1, l_var=C
func3: l_var3=C
1
31.05.2021, 12:10
2 ответа

Само ядро ​​содержит внутренний вызов execve()для создания процесса 1 (init ), который никогда не завершается.

Init ()является корнем всего дерева процессов. Он начинается с разветвления процессов для всех известных служб и других настроенных задач, а также для всех устройств входа в систему.

4
28.07.2021, 11:27

Когда вы запускаете программу из оболочки, оболочка является ее родительским процессом.

Оболочка вызывает fork()для создания нового дочернего процесса, затем в этом новом процессе вызывает один из семейства exec()для запуска вашей программы.

Если ваша программа запущена другим (не -процессом )оболочки, последовательность будет такой же.

Очевидно, что это должно где-то начинаться :конечным предком всех процессов является initпроцесс (PID 0 ), который волшебным образом запускается ядром для запуска пользовательского пространства.

1
28.07.2021, 11:27

Теги

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