C语⾔模拟终端执⾏shell命令
程序只⽀持ls、cat和ps三个命令,思路是在⽤户输⼊⼀条命令之后fork⼀个新的进程,在新的进程⾥⾯执⾏命令。
在我理解中,Mac的终端思路应该是类似的。在打开终端之后,程序会读取配置⽂件中⽬录下可执⾏的命令,然后根据⽤户的命令判断命令是否存在,如果存在,则fork出⼀个新的进程执⾏,否则返回“command not found”。
本来觉得代码不复杂,但是写了很长时间,主要是两个问题,⼀个是strtok函数⼀直有问题,整了好长时间都没搞明⽩该怎么处理,最后没办法⾃⼰实现了⼀个⾮常简陋的字符串截取函数(只⽀持按照单个空格截取);另⼀个是指针的处理,我对C语⾔的指针⼀直不太熟悉,遇上稍微复杂的⼀些情况就不知道该怎么弄,折腾了很久。
写完之后我在想应该不需要fork⼀个新的进程,直接执⾏命令好像就⾏了。
不过没关系,我想写⼀个简单的web服务器,就当是练⼿了。
程序执⾏结果:
上代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
int split(char *s,char *delim[])
{
int j=0;
int k=0;
char temp[100];
for(int i=0;s[i]!='\0';i++)
{
if(s[i]!=' ')
{
temp[j++]=s[i];
}else
{
temp[j]='\0';
delim[k] = (char *)malloc(strlen(temp));
strcpy(delim[k],temp);
j=0;
k++;
}
}
temp[j]='\0';
delim[k] = (char *)malloc(strlen(temp));
strcpy(delim[k],temp);
k++;
return k;
}
int main()
{
char *commands[] = {"/bin/ls","/bin/cat","/bin/ps"};
int parent_pid = getpid();
while(1)
while(1)
{
printf("Please input your command: ");
char *command;
fgets(command,100,stdin);
command[strlen(command)-1]='\0';
fork();
int pid = getpid();
if(pid==parent_pid)
{
wait(NULL);
continue;
}else
{
shell命令属于什么语言
int flag = 0;
char *argv[5];
int k = split(command,argv);
argv[k]=NULL;
for(int i=0;i<3;i++)
{
if(strstr(commands[i],argv[0]))
{
flag=1;
char *envp[] = {NULL};
execve(commands[i],argv,envp);
break;
}
}
if(!flag)
{
printf("command not found: %s\n",argv[0]);  }
break;
}
}
return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。