ANSI C fork() exec*()

0

Witam, potrzebuję pomocy.
Mam do jutra do zrobienia powłokę microshell w linuxie w ansi c. Już całość zrobiłem oprócz 1 punktu:

"przyjmować polecenia odwołujące się przez nazwę do programów znajdujących się w katalogach opisanych wartością zmiennej środowiskowej PATH oraz umożliwiać wywołanie tych skryptów i programów z argumentami (czyt. fork() + exec*());"

Przyjmowanie różnych poleceń zrobiłem funkcją system() i działa dla ścieżek w PATH ale nie rozumiem drugiej części z tym fork i exec. Mógłby mnie ktoś nakierować?

1

Masz użyć nie system() tylko fork() i exec()

0

Dzięki za zainteresowanie, mógłbyś trochę szerzej to opisać?

3

http://man7.org/linux/man-pages/man2/fork.2.html
https://linux.die.net/man/3/exec

To typowy (ale nie zawsze wydajny) idiom tworzenia procesów w *nixach: forkujesz obecny, w kopii nadpisujesz wszystko za pomocą execa. Tego od Ciebie oczekuje to zadanie. Nie wiem czy możesz użyć wariantu szukającego w PATH, czy szukanie w PATH musisz zaimplementować sam. Patrząc na samo zadanie, zakładam, że oczekuje się od Ciebie, że sam skotenizujesz i przeszukasz PATH.

0

Mam taką część kodu:

void program(char polecenie[]){
pid_t pid=fork();
if(pid==0) wait(NULL);
else if(pid>0){
execl(_CS_PATH, polecenie, (char *)0);
printf("d",errno);
}
}

gdzie polecenie to przykładowo "ps", "ls -l"
Program działa pętli while(1). I ten kod co jakiś czas wywołuje fork-bombę a czasem po prostu kopiuje mojego microshella. Kod błędu errno to 14. Pomoże ktoś co robię nie tak?

2

Do funkcji z rodziny exec nie możesz podać całego polecenia z parametrami jako jeden string, tylko musisz najpierw podzielić ten string na nazwę programu i poszczególne parametry i podać je osobno, np.: execlp("ls", "ls", "-l", (const char *) 0);

Albo - lepiej pasujące do zadania: char * args[] = { "ls", "-l", NULL }; execvp(args[0], args);

Jeśli chodzi o errno: zamiast wypisywania wartości liczbowej użyj printf("%s\n", strerror(errno));

1 użytkowników online, w tym zalogowanych: 0, gości: 1