命令解释程序c语言
解释器(英文:Interpreter),也译作literal translator,是一种可以直接逐行翻译并运行一种高级编程语言的计算机程序。
预编译器的不同之处在于它逐行解释操作,类似于解释python等执行语言。
求解释代码,关于用C语言写一个简单的shell解释器。 #包含stdio.h
#包含stdlib.h
#包含字符串. h
#包含fcntl.h
#包括unistd.h
#包含sys/wait.h
#定义命令_行1024
#定义管道_最大16
#define ARG_MAX 10
typedef结构{
char * ARG[ARG _ MAX];
char * in
char * out
} cmd _ t;
extern int parse_token(char *buf,cmd _ t cmd[]);
extern int parse(char *buf,cmd _ t * cmd);
extern int test_parse(cmd_t cmd[],int len);
int main(int argc,char *argv[])
{
char buf[CMD _ LINE];
cmd _ t cmd[PIPE _ MAX 1];
int FD[PIPE _ MAX][2];
int j,I;
int cmd_len,pipe _ len
pid _ t pid
while (1) {
printf(" my _ shell # ");//打印提示
fgets(buf,CMD_LINE,stdin);//获取输入
buf[strlen(buf)-1]= ' \ 0 ';//去掉结尾的换行符?
cmd_len = parse_token(buf,cmd);//解析命令
管道_长度= cmd _长度-1;//
if(管道长度管道最大值)
继续;
for(I = 0;i pipe _ len我)
管道(FD[I]);//创建pipe_len管道。
for(I = 0;i cmd _ lenI) //创建cmd_len进程。
If ((pid = fork()) == 0) //判断是否为子进程。
打破;//如果是子进程,跳出for循环。
If (pid == 0) {//循环中是子流程代码。
if (pipe_len) {
If (i == 0) {//第一个子进程
close(FD[I][0]);//关闭管道的读取端。
dup2(fd[i][1],1);//复制管理的写入端是标准输出(标准输出会写入管道)。
close(FD[I][1]);//关闭管道的写入端。
for(j = 1;j pipe _ lenj)
Close(fd[j][0]),//关闭不相关进程的管道。
close(FD[j][1]);
} else if(I = = pipe _ len){//pipe _ len的子进程。
close(FD[I-1][1]);//关闭管道的写入端。
dup2(fd[i - 1][0],0);//复制管理的读取端是标准输出(标准输入会读取管道)。
close(FD[I-1][0]);//关闭管道的读取端。
for(j = 0;j pipe _ len-1;j)
Close(fd[j][0]),//关闭不相关进程的管道。
close(FD[j][1]);
} else {//其他子流程
dup2(fd[i - 1][0],0);//复制管理的读取端是标准输出(标准输入会读取管道)。
close(FD[I][0]);//关闭管道的读取端。
dup2(fd[i][1],1);//复制管理的写入端是标准输出(标准输出会写入管道)。
close(FD[I][1]);//关闭管道的写入端。
for(j = 0;j pipe _ lenj) {
如果((j!= i-1) //关闭无关进程的管道。
|| (j!=我))
close(fd[j][0]),
关闭(fd[j]
[1]);
}
}
}
If (cmd[i]。in) {//如果需要,打开输入文件并重定向它。
int fd = open(cmd[i])。in,O _ RDONLY);
dup2(fd,STDIN _ FILENO);
关闭(FD);
}
If (cmd[i]。out) {//如果需要,打开输出文件并重定向它。
int fd =
打开(cmd[i]。出去,
O_RDWR | O_CREAT | O_TRUNC,0644);
dup2(fd,STDOUT _ FILENO);
关闭(FD);
}
execvp(cmd[i].arg[0],cmd[i]。arg);//执行当前命令
fprintf(stderr,"失败的exec \ n ");//命令失败后,执行代码。
出口(127);
}//子进程代码结束
/*父*/
for(I = 0;i pipe _ len我)
close(fd[i][0]),close(FD[I][1]);
for(I = 0;i cmd _ len我)
等待(空);//等待子进程结束。
}
返回0;
}
int parse_token(char *buf,cmd_t cmd[])
{
int n = 0;
#如果1
char * save _ p;
char *p = strtok_r(buf," | ",save _ p);//用“|”除法命令将第一部分除以P。
而(p!= NULL) {
parse(p,cmd[n]);
p = strtok_r(NULL,“|”,save _ p);//把下面的部分给P,一次给一部分,每次给下一部分。
}
#else //不执行下一条语句。
cmd[n]。arg[0]= " ls ";
cmd[n]。arg[1]= "-l ";
cmd[n]。arg[2]= NULL;
#endif
返回n;
}
Inttest _ parse (cmd _ tcmd [],int len)//此函数未被调用。
{
int I;
for(I = 0;我leni) {
printf("cmd[%d]:",I);
int j = 0;
while (cmd[i].arg[j])
printf(" %s ",cmd[i]。arg[j]);
if (cmd[i]。在)
printf("\tin:%s ",cmd[i]。在);
if (cmd[i]。out)
printf("\tout:%s ",cmd[i]。out);
printf(" \ n ");
}
返回0;
}
int parse(char *buf,cmd_t * cmd)
{
int I = 0;
cmd-in = NULL;
cmd-out = NULL;
char *p = strtok(buf," ");//用空格分割命令(此时命令已经被|)分割
while (p) {
If (*p == '') {//如果命令以开始,则需要输入重定向。
If (*(p 1)) //在这种情况下,文件名后面直接跟空格。
cmd-in = p 1;
Else //这种情况后面跟一个空格。
cmd-in = strtok(NULL," ");
} else if (*p == '') {//如果命令以开头,则需要重定向输出。
If (*(p 1)) //在这种情况下,文件名后面直接跟空格。
cmd-out = p 1;
Else //这种情况后面跟一个空格。
cmd-out = strtok(NULL," ");
}否则
cmd-arg[I]= p;//这是一个普通的命令或参数。
p = strtok(空," ");
}
cmd-arg[I]= NULL;
返回0;
}
如何用C语言实现C解释器 把C语言翻译成“汇编”塞进内存,然后用一个“虚拟机”来运行这个汇编。
所以我们需要的是:
虚拟机:用于运行以下程序集。
汇编:用来描述原始C语言。
一个“翻译器”:把C语言翻译成上面的汇编。
c语言cmd窗口在哪里? ㄑ
m.wangchao.net.cn
推荐

什么是cmd窗口,如何打开?
报告/更正
分类:计算机/网络操作系统/系统故障
参考答案:
Cmd是command的缩写。命令行
在9x系统上,可以通过键入command来打开命令行。在NT系统上,可以输入cmd打开。
在命令行上,你可以看到你的系统版本,文件系统版本等等。
您可以键入help来查看帮助。
Cmd启动命令解释器Cmd.exe的一个新实例。如果不带参数使用,cmd将显示Windows XP的版本和版权信息。
语法
cmd[[{/c |/k }][/s][/q][/d][{/a |/u }][/t:fg][/e:{ on | off }][/f:{ on | off }][/v:{ on | off }]string]
参数
/c
执行string指定的命令,然后停止。
/k
执行字符串指定的命令并继续。
/s
修改/c或/k后的字符串处理。
/q
关闭回声。
/d
禁用自动运行命令执行。
/a
创建美国国家标准协会(ANSI)输出。
/u
创建Unicode输出。
/t:fg
设置前景f和背景g的颜色。下表列出了可用作f和g值的有效十六进制数字。值颜色
0黑色
1蓝色
2绿色
3湖蓝色
4红色
5紫色
6黄
7白色
8灰色
9浅蓝色
浅绿色
浅水绿色
c浅红色
浅紫色
e浅黄色
f亮白色
/e:开
启用命令扩展。
/e:关闭
禁用命令扩展。
/f:开
启用文件名和目录名已完成。
/f:关
禁用文件名和目录名。完成了。
/v:开
启用延迟环境变量扩展。
/v:关闭
禁用延迟环境变量扩展。
线
指定要执行的命令。
/?
在命令提示符下显示帮助。
给…作注解
使用多个命令
您可以在一个字符串中使用由分隔的多个命令,但这些命令必须用引号括起来(例如,“commandcommandcommand”)。
处理引号
如果指定了/c或/k,并且满足以下所有条件,cmd将处理字符串中的其余命令并保留引号:
不使用/s。
正确使用一对引号。
不要在引号中使用任何特殊字符(例如:()@ |}。
引号中使用了一个或多个空格字符。
引号中的字符串是可执行文件的名称。
如果不能满足上述条件,将首先检查字符串的第一个字符,验证它是否是左引号。如果第一个字符是左引号,它将与右引号分开。右引号后面的任何文本都将被保留。
执行注册表子项
如果/d没有在string中指定,Cmd.exe将查找以下注册表子项:
HKEY _ LOCAL _ MACHINE \ Software \ Microsoft \ Command Processor \ AutoRun \ REG _ SZ
HKEY _当前_用户\软件\微软\命令处理器\AutoRun REG_EXPAND_SZ
如果上述注册表子项中的一个或两个都存在,它们将在其他变量执行之前执行。
警告
注册表编辑不当可能会严重损坏您的系统。在更改注册表之前,您应该备份计算机上任何有价值的数据。
启用和禁用命令扩展
在Windows XP中,默认情况下会启用命令扩展。您可以使用/e:off来禁用某些过程。通过设置以下REG_DWORD值,可以在计算机上或用户会话中启用或禁用所有cmd命令行选项的扩展:
HKEY _ LOCAL _ MACHINE \ Software \ Microsoft \ Command Processor \ enable extensions \ REG _ DWORD
HKEY _当前用户\软件\ Microsoft \命令处理器\EnableExtensions\REG_DWORD
在注册表中使用Regedit.exe可以将REG_DWORD值设置为0×1(即启用)或0×0(即禁用)。用户特定的设置优先于计算机设置,命令行选项优先于注册表设置。
警告
注册表编辑不当可能会严重损坏您的系统。在更改注册表之前,您应该备份计算机上任何有价值的数据。
启用命令扩展时,以下命令将受到影响:
协会
呼叫
光盘目录
颜色
删除(擦除)
结束本地
为
ftype
转到
如果
医学博士
popd
提示
pushd
设置
setlocal
变化
开始(也包括将改变外部命令的程序)
有关这些命令的更多信息,请参见相关主题。
启用延迟环境变量扩展
启用延迟环境变量扩展,可以使用感叹号字符代替运行时环境变量值。
启用文件和目录名称已完成。
默认情况下,禁用文件名和目录名是完整的。对于特定的cmd命令处理,您可以通过/f:{on|off}来启用或禁用此功能。通过设置以下REG_DWORD值,可以启用或禁用由计算机上或用户会话中的所有cmd命令处理的文件和目录名补全:
HKEY _ LOCAL _ MACHINE \ Software \ Microsoft \ Command Processor \ completion char \ REG _ DWORD
HKEY _ LOCAL _ MACHINE \ Software \ Microsoft \ Command Processor \ PathCompletionChar \ REG _ DWORD
HKEY _当前用户\软件\微软\命令处理器\CompletionChar\REG_DWORD
HKEY _当前用户\软件\微软\命令处理器\PathCompletionChar\REG_DWORD
要设置REG_DWORD的值,请运行Regedit.exe并使用特定函数的控制字符的十六进制值(例如,0×9表示TAB键,0×08表示退格键)。用户特定的设置优先于计算机设置,命令行选项优先于注册表设置。
警告
注册表编辑不当可能会严重损坏您的系统。在更改注册表之前,您应该备份计算机上任何有价值的数据。
如果使用/f:on启用了文件和目录名完成,则可以使用CTRL D进行目录名完成。对于文件名补全,可以使用Ctrl F。要禁用注册表中特定字符的补全,请使用空格值[0×20],因为空格不是有效的控制字符。
当按CTRL D或CTRL F时,cmd处理文件名和目录名的补全。这些组合键的目的是将通配符(如果尚未使用)附加到字符串,创建匹配路径列表,然后显示第一个匹配路径。如果所有路径都不匹配,文件和目录名称完成操作将发出警告声,并且显示的内容不会改变。要逐个查看匹配路径列表中的路径,请重复按CTRL D或CTRL F。若要向后查看列表,请在按住SHIFT的同时按CTRL D或CTRL F。要放弃保存的匹配路径列表并生成新列表,可以编辑string,然后按CTRL D或Ctrl F。如果在CTRL D和CTRL F之间切换,保存的匹配路径列表将被放弃,并将生成新列表。CTRL D和CTRL F唯一的区别是,CTRL D只匹配目录名,而CTRL F同时匹配文件名和目录名。如果在任何内部目录命令(CD、MD或RD)中使用了文件和目录名补全,将只使用目录补全。
如果匹配路径用引号括起来,文件和目录名补全将正确处理包含空格或特殊字符的文件名。
以下特殊字符需要引号:[]{ } =;!,` ~ ~[空白]
如果您提供的信息包含空格,请将文本用引号括起来(例如,“计算机名”)。
如果从字符串中处理文件名和目录名以完成操作,则位于光标右侧的[Path]的任何部分都将被丢弃(即字符串中处理操作的位置)。
设置图例格式
格式含义
斜体用户必须提供的信息。
用户必须准确键入的粗体元素,如图所示。
省略号(...)是一个可以在命令行中重复多次的参数。
方括号([])中的可选项目
在大括号({})之间;用竖线(|)分隔选项。例如:{even|odd}用户只能从中选择一个选项的选项组。
Courier字体代码或程序输出
最后更新于 2023-10-13 01:47:44 并被添加「」标签,已有 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章