#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define N 110
char s[N];
char cmd[N], content[N];
char path[N];
void split()
{
int n = strlen(s), i = 0, j = 0;
j = 0;
while(i<n&&s[i]!=' ')
cmd[j++] = s[i++];
cmd[i] = '\0';
while(i<n&&s[i]==' ')
i++;
j = 0;
while(i<n)
content[j++] = s[i++];
content[j] = '\0';
}
void createProcess(char cmd[])
{
int pid = fork();
if(pid<0)
{
printf("子进程创建失败\n");
return;
}
if(pid>0)
{
wait(0);
return;
}
if (strcmp(cmd, "echo") == 0)
execlp("echo", "echo", content, NULL);
if (strcmp(cmd, "jobs") == 0)
execlp("ps", "ps", "-x", NULL);
if (strcmp(cmd, "environ") == 0)
execlp("env", "env", NULL);
if (strcmp(cmd, "ls") == 0)
execlp("ls", "ls", NULL);
if (strcmp(cmd, "pwd") == 0)
execlp("pwd", "pwd", NULL);
exit(0);
}
int main()
{
while(1)
{
getcwd(path, N);
printf("[%s] $", path);
gets(s);
split();
if (strcmp(cmd, "help") == 0)
{
printf("****************************************************************** **************\n");
printf("echo <content>\t\t 输出 content 内容\n");
printf("quit || exit || bye\t 退出 shell\n");
printf("cd <catalogue>\t\t 更改当前的工作目录到另一个\n");
printf("environ\t\t\t 列出所有环境变量字符串的设置\n");
printf("jobs\t\t\t 输出 shell 当前的一系列子进程,提供子进程的命名和 PID 号。 \n");
printf("ls \t\t\t 显示当前文件目录列表,列出所有文件。\n");
printf("pwd \t\t\t 显示目前所在的工作目录的绝对路径名称。\n");
printf("****************************************************************** **************\n");
continue;
}
if (strcmp(cmd, "cd") == 0)
{
if (strlen(content) == 0) createProcess("ls");
else if (chdir(content) == -1)
printf("目录错误\n");
continue;
}
if (strcmp(cmd, "quit") == 0 || strcmp(cmd, "exit") == 0 || strcmp(cmd, "bye") == 0)
{
printf("退出程序");
return 0;
}
if (strcmp(cmd, "echo") == 0)
{
createProcess("echo");
continue;
}
if (strcmp(cmd, "jobs") == 0)
{
createProcess("jobs");
continue;
}
if (strcmp(cmd, "environ") == 0)
{
createProcess("environ");
continue;
}
if (strcmp(cmd, "ls") == 0)
{
createProcess("ls");
continue;
}
if (strcmp(cmd, "pwd") == 0)
{
createProcess("pwd");
continue;
}
printf("没有该指令\n");
}
}