Если execvp завершается успешно, все адресное пространство дочернего процесса заменяется программой, вызванной execvp()
.Это означает, что exit(0)
будет вызываться только после двух ваших особых случаев, то есть cd
и sdir
.Что касается вашего кода, то execvp()
никогда не должен возвращаться, если только нет ошибки.
Еще одна проблема заключается в том, что вы освобождаете args
сразу после его выделения, а затем продолжаете использовать его у своего ребенка.процессы.Это неопределенное поведение.
Единственная проблема, которую я вижу с вашим кодом wait
, заключается в том, что, если какой-либо из дочерних элементов блокирует ожидание пользовательского ввода, родительский блок блокирует ожидание выхода дочернего элемента.
Код cd
не влияет ни на один процесс, кроме дочернего, в котором он выполняется.Текущий каталог родителя не затрагивается.Как вы указали в комментариях, это можно исправить, обработав cd
в родителе без разветвления.