Om argumentet till "exec" -familjen av funktioner (t.ex. "execl", "execv", "execvp") i Linux är inte körbar, kommer "exec" -samtalet att misslyckas. Processen kommer * inte * att byta till att köra den angivna filen.
Speciellt:
* `errno` kommer att ställas in: Den "Errno" globala variabeln kommer att ställas in för att indikera felet. Det mest troliga värdet kommer att vara "enoexec" (körbart formatfel), vilket innebär att filen inte är en giltig körbar för den aktuella arkitekturen, eller "eacces" (tillstånd nekad), vilket innebär att processen inte har tillstånd att köra filen (även om den är en giltig körbar). Andra fel är möjliga beroende på de specifika omständigheterna (som filen som inte finns, "Enoent").
* Den ursprungliga processen fortsätter: Den ursprungliga processen kommer * att fortsätta * springa. "Exec" -samtalet kommer att returnera -1, och programmet kommer att fortsätta körningen från punkten efter det misslyckade "exec" -samtalet. Detta är avgörande; Det avslutar inte processen. Din kod bör kontrollera returvärdet för `exec 'för att hantera detta fel graciöst. Att helt enkelt ignorera returvärdet kan leda till subtila och svåra att debugga buggar.
Exempel (c):
`` `c
#include
#include
#include
#include
int main () {
int ret =execl ("./ nonexistent_program", "nonexistent_program", null);
if (ret ==-1) {
fprintf (stderr, "execl misslyckades:%s \ n", strerror (errno));
return 1; // Ange ett fel
}
// Denna rad kommer endast att nås om execl lyckas (vilket det inte kommer att i detta exempel)
printf ("Detta ska inte skrivas ut. \ n");
return 0;
}
`` `
Denna kod försöker utföra ett icke-existerande program. "Execl" -samtalet kommer att misslyckas, "Errno" kommer att ställas in (sannolikt "Enoent"), "Strerror (Errno)" kommer att ge ett mänskligt läsbart felmeddelande, och programmet kommer att skriva ut felet och avsluta med en icke-noll status. Om filen fanns men saknade körtillstånd, skulle "errno" troligen vara "eacces".
Kort sagt, ett misslyckat "exec" -samtal på grund av en icke-genomförbar fil är ett runtime-fel som måste hanteras uttryckligen inom ditt program för att förhindra oväntat beteende. Kontrollera alltid returvärdet för "exec" och hantera fel på lämpligt sätt.