命令解释程序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字体代码或程序输出

相关文章

发表新评论