Семейство функций Exec заменяет существующий образ процесса новым образом процесса.Вот почему требуется выполнить разветвление перед порождением другого процесса, поскольку текущий выполняемый процесс полностью заменен, включая счетчик программ, который отслеживает выполнение следующей инструкции.
printf("should fail");
никогда не выполняетсяпоскольку в тот момент, когда вы вызвали execv(args[0], args)
, программный счетчик был перемещен для выполнения args [0], что оставило позади путь выполнения, который привел бы к этому оператору печати.
Exec возвращает -1 при условии, чтопри замене изображения произошла ошибка, и она не имеет абсолютно никакого отношения к возвращаемому значению выполняемой программы.Это связано с тем, что после вызова Exec два процесса вообще не координируются друг с другом.Помните: команда fork()
создала новое адресное пространство, что означает, что эти процессы теперь выполняются в отдельных доменах в отдельных исполняемых файлах.
Может помочь некоторая документация:
http://man7.org/linux/man-pages/man3/exec.3.html
Надеюсь, это помогло.