WOJSKOWA AKADEMIA TECHNICZNA
LABORATORIUM SYSTEMÓW OPERACYJNYCH Laboratorium nr 5 |
---|
Grupa |
Lp. |
1. |
Treść zadania.
Napisać program powłoki (shell) w języku C, który za pomocą funkcji fork i exec będzie realizował polecenia ls, who, date oraz cat.
Kod programu.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define max 3
int kom(char *l, char **s){
char *c;
int i=0;
c=strtok(l," ");
while(c!=NULL && i<(max-1)){
s[i]=c;
c=strtok(NULL," ");
i++;
}
s[i]=NULL;
return i;
}
main(){
char *s[max];
char l[50];
int i,j;
printf("\n");
while(1){
write(1,"shell> ",7);
i=read(0, l, 50-1);
if(i==0) break;
l[i]=0;
if(l[i-1]=='\n') l[i-1]=0;
j=kom(l, s);
if(strcmp(s[0],"exit")==0){
return 0;
}
if((strcmp(s[0],"ls")==0) || (strcmp(s[0],"who")==0) || (strcmp(s[0],"date")==0) || (strcmp(s[0],"cat")==0)){
if(j>=1){
if(fork()==0)
execvp(s[0],s);
else{
int pid,stat=1;
pid=wait(&stat);
}
}
}
}
}
Podsumowanie.
Dzięki funkcji fork oraz exec mogłam stworzyć własny interpreter poleceń.
Jeżeli wywołamy funkcję fork (jak jest to w powyższym kodzie programu) po wcześniejszym podaniu argumentu np. ls. Fork wywoła proces o nazwie ls, ponieważ jest to skrypt powłoki, zostaje wywołany w taki sam sposób jak gdyby użytkownik w terminalu wpisał komendę ls. Interpreter powoduje wywołanie poprzez stworzenie nowego procesu danej funkcji podanej do interpretera.
Jest to przykład bardzo ciekawego i pouczającego (dla osoby dopiero poznającej systemy UNIX) zastosowania funkcji fork oraz exec.