实验过程
(注释:mkfile 和mkdir 命令可以带-hXXX/-lXXX 例如 mkfile -hppp 意思就是调用mkfile函数 执行-h命令参数值为ppp )
1 为menu子系统设计接口。
menu.h
int MenuConfig(char *cmd, char *desc, int (*handler)());int ExcuteMenu();
将menu.c里的main函数改成ExcuteMenu()函数,讲重写InitMenuData(),用MenuConfig()函数实现原来InitMenuData()的功能。参考老师的代码实现。
2 完成Makefile
CC_PTHREAD_FLAGS = -lpthread
CC_FLAGS = -cCC_OUTPUT_FLAGS = -o
CC = gcc
RM = rm
RM_FLAGS = -f
TARGET = m
OBJS = link_table.o link_list.o business_logic_layer.o menu.o
all: $(OBJS) $(CC) $(CC_OUTPUT_FLAGS) $(TARGET) $(OBJS)
.c.o:
$(CC) $(CC_FLAGS) $<
clean:
$(RM) $(RM_FLAGS) $(OBJS) $(TARGET) *.bak
3 使menu子系统支持带参数的命令,使用getopt函数
int executeMenu()
{
printf("Ctrl c to exit\n");
while(1)
{
int argc=0;
char *argv[CMD_MAX_ARGV_NUM];
char cmd[CMD_LEN];
char *pcmd=NULL;
printf("please input cmd >");
pcmd=fgets(cmd,CMD_LEN,stdin);
if(pcmd==NULL)
{
continue;
}
pcmd=strtok(pcmd," ");
while(pcmd!=NULL&&argc<CMD_MAX_ARGV_NUM)
{
argv[argc]=pcmd;
argc++;
pcmd=strtok(NULL," ");
}
if(argc==1)
{
int len=strlen(argv[0]);
*(argv[0]+len-1)='\0';
}
int i=business_find_cmd(argc,argv);
if(i==FAIL)
{
continue;
}
}
}
mygetopt函数
int myGetopt(int argc,char* argv[])
{
int ch;
while((ch=getopt(argc,argv,"h:l:"))!=-1)
{
switch(ch)
{
case 'h':
printf("option h,name:%s",optarg);
strcpy(argv[1],optarg);
break;
case 'l':
printf("option l,name:%s",optarg);
strcpy(argv[1],optarg);
break;
}
return SUCCESS;
}
printf("wrong cmd\n");
executeMenu();
}
实验代码