Добавил:
Fragga
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:лабораторки по ОС препод Челноков / 2семестр / VD / BuH / inter
.c#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
extern char ** environ;
#define CMDSIZE 80
#define CD 1
#define ECHO 2
#define EXEC 3
#define PROGRAM 1000
#define MAXPATH 100
int parse_command (char * cmdbuf, char * path, char **arguments)
{
printf("CMD: '%s'\n", cmdbuf);
if (strcmp(cmdbuf, "cd")==0)
{
printf("Internal command: \"cd\" executing\n");
return(CD);
}
if (strcmp(cmdbuf, "echo")==0)
{
printf("Internal command: \"echo\" executing\n");
return(ECHO);
}
if (strcmp(cmdbuf, "exec")==0)
{
printf("Internal command: \"exec\" executing\n");
return(EXEC);
}
if (strcmp(cmdbuf, "program")==0)
{
printf("Internal command: \"program\" executing\n");
return(PROGRAM);
}
}
main ()
{
char cmd[CMDSIZE];
int cmdsize;
int command;
int stat_loc;
int pid;
char path;
char **args;
char cmdpath[MAXPATH];
while (1)
{
write (1, "BuHshell$ ", 10);
cmdsize = read(0, cmd, CMDSIZE);
cmd[cmdsize-1] = '\0';
printf ("%s\n", cmd);
command = parse_command(cmd, cmdpath, args);
switch (command)
{
case (CD):
write (1,"OK\n", 3);
chdir (args[0]);
// execlp("pwd", "pwd", NULL);
break;
case (ECHO):
write (1, args[0], strlen(args[0])); break;
case (EXEC):
// execve (path, args, environ);
write (2, "Shell:cannot execute\n",21); break;
case (PROGRAM):
pid = fork();
if (pid < 0)
{
write (2, "Shell:cannot fork\n", 18);
} else if (pid == 0) {
// execve (path, args, environ);
write (2, "Shell execute\n", 21);
} else {
wait (&stat_loc);
break;
}
} //end switch
}
}