ANSI C fork() exec*()

ANSI C fork() exec*()
MS
  • Rejestracja:około 9 lat
  • Ostatnio:około 5 lat
  • Postów:29
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ć?

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Szczecin
1

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


MS
  • Rejestracja:około 9 lat
  • Ostatnio:około 5 lat
  • Postów:29
0

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

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Szczecin
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.


MS
  • Rejestracja:około 9 lat
  • Ostatnio:około 5 lat
  • Postów:29
0

Mam taką część kodu:

Kopiuj
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?

edytowany 2x, ostatnio: mskant
TA
  • Rejestracja:około 7 lat
  • Ostatnio:około 9 godzin
  • Postów:266
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));

edytowany 1x, ostatnio: Troll anty OOP

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.