Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
5
Добавлен:
26.05.2014
Размер:
1.72 Кб
Скачать
#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
    }
}
Соседние файлы в папке BuH