/ / C - przekazanie nieznanego polecenia do execvp () - shell, execvp

C - przekazanie nieznanego polecenia do execvp () - shell, execvp

Piszę fałszywą skorupę, w której tworzę dzieckoproces, a następnie wywołaj execvp (). W normalnej powłoce po wprowadzeniu nieznanego polecenia, takiego jak „witaj”, zwraca „hello: Command not found”. Jednakże, kiedy przekazuję hello do execvp (), nie zwraca on żadnego błędu domyślnie i po prostu kontynuuje działanie reszty mojego programu, jakby nic się nie stało. oto mój kod:

if(fork() == 0)
{
execvp(cmd, args);
}
else
{
int status = 0;
int corpse = wait(&status);
printf(Child %d exited with a status of %dn", corpse, status);
}

Wiem, że jeśli ciało <0, to jest nieznanepolecenie, ale w moim kodzie są inne warunki, których nie ma na liście, gdzie nie chcę czekać (na przykład, czy na końcu polecenia wpisano &).

Odpowiedzi:

3 dla odpowiedzi № 1

Wszystkie z tych exec metody mogą zwrócić -1, jeśli wystąpił błąd (errno jest odpowiednio ustawiony). Nie sprawdzasz wyniku execvp więc jeśli się nie powiedzie, reszta twojego programu będzie kontynuowała wykonywanie. Możesz mieć coś takiego, aby zapobiec wykonywaniu reszty programu:

if (execvp(cmd, args) == -1)
exit(EXIT_FAILURE);

Chcesz również sprawdzić wynik fork() dla <0.


0 dla odpowiedzi nr 2

Masz dwie niezależne obawy.

1) to zwracana wartość execvp. Nie powinien on zwracać. Jeśli tak, to pojawia się problem. Oto co otrzymuję execvp „złym poleceniem. Nie chcesz czekać, jeśli execvp się nie powiedzie. Zawsze sprawdzaj wartości zwracane.

int res = execvp(argv[1], argv);
printf ("res is %i %sn", res, strerror(errno));
// => res is -1 No such file or directory

2) Innym problemem są procesy w tle itaki. To jest zadanie powłoki i będziesz musiał dowiedzieć się, kiedy twój program powinien natychmiast zaczekać i kiedy chcesz zapisać pid z fork i poczekać na to później.