Funkcja systemowa exec() występuje w standardowym API aż w 6 postaciach. Poszczególne wersje różną się od siebie sposobem przekazywania parametrów i poszukiwania pliku. Tematem tego tekstu nie jest omawianie API, dlatego zainteresowanym tym zagadnieniem polecam man exec. Ten tekst będzie poświęcony wywołaniu execve(), które dostaje listę parametrów wywołania jako tablicę, i nie przeszukuje ścieżkę ze zmiennej środowiskowej PATH.
Zanim przejdziemy do właściwego omawiania funkcji, warto zaznaczyć, że Linux obsługuje wiele formatów plików wykonywalnych. Z tego względu to nie funkcja exec() wykonuje program, ona tylko przygotowuje środowisko, zaś samo wykonanie jest zlecane odpowiedniemu interpreterowi. W przestrzeni jądra jest zdefiniowana lista fromats na której znajdują się adresy funkcji lądujących. To właśnie jedna z tych funkcji ładuje program. Warto tutaj zwrócić uwagę na olbrzymią elastyczność systemu Linux. Pozwala on dodawać i usuwać funkcje ładujące. Służą do tego odpowiednio register_binfmt() i unregister_binfmt(), zdefiniowane w pliku fs/exec.c. W gruncie rzeczy pozwala to nawet na uruchamianie programów napisanych dla systemu Windows(TM).