我正在尝试使用C,Bison和Flex开发自己的shell。所有的野牛和flex代码都可以工作,我的问题在于链表。我应该能够获得野牛代码识别的参数并将它们解析为 execvp((,以便我可以执行我想要的命令。我该怎么做?我需要将它们解析为字符串吗?
注意:我没有使用参数,因为我试图在另一个函数中调用 execvp((。
输入如下所示:
./interpretador
mostra file
其中"mostra"是我要执行的程序,"file"是作为第二个参数的文件
执行命令的代码:
case MOSTRA:
{
pid = fork();
printf("nPID: %dn", pid);
if (pid == 0)
{
printf("nDone.n ");
/*What I'm trying to do*/
if (execvp(lst->type, lst->arg1) == -1)
{
perror("nErro no Execn");
}
//printf("nexecutoun");
exit (1);
} else if (pid < 0)
{
perror ("nErro!");
exit(1);
}else
{
while (wait(&estado) != pid);
}
}
break;
链表:
command *mostra(command *lst, Value* path)
{
command *node = (command*) malloc(sizeof(command));
node->type = MOSTRA;
node->arg1 = path;
node->next = lst;
node->subCommands = NULL;
return node;
//printf("cheguei aqui");
}
外壳的链接列表:
Interpretador *new_interpretador()
{
Interpretador *interpretador = (Interpretador*) malloc(sizeof(Interpretador));
interpretador-> vars = NULL; // no variables in the beginning
return interpretador;
}
野牛代码:
program : commandList { Launch($1); };
commandList
: command { $$ = $1; }
| command commandList { $1->next = $2; $$ = $1; }
;
command
: MT VAR_VALUE { $$ = mostra ( NULL, $2 ); }
| AP VAR_VALUE { $$ = apaga ( NULL, $2); }
| AC NAME VAR_VALUE { $$ = acrescenta ( NULL, $2, $3); }
| MAKE VAR_NAME value { $$ = insert_Make (NULL, $2, $3); }
;
value: INT { /*$$ = new_int_value($1);*/ }
| NAME { $$ = new_name($1); }
| VAR_VALUE { $$ = new_var_value($1); }
;
%%
int yyerror(char* msg) {
printf("ERROR: %sn", msg);
return 0;
}
弹性代码:
%%
make { return MAKE; }
mostra|mt { return MT; }
[a-zA-Z0-9._-]+ { yylval.str = strdup(yytext); return VAR_VALUE; }
$[a-z]+ { /*return VAR_NAME;*/}
[ nrt] { /* ignore */ }
. { return yytext[0]; }
%%
int yywrap() { return 1; }
execvp
对链表实现一无所知。它也不知道你的枚举值,比如MOSTRA
。
它期待两个论点。第一个是可执行文件的名称,要在$PATH
中搜索,或可执行文件的绝对路径。第二个参数是字符串数组,其中数组中的第一个元素是程序的名称,参数从第二个元素开始,最后一个元素是NULL
。
换句话说,你需要构造一个(从你的链表(一个看起来像这样的数组:
char* argv = {"mostra", "file", NULL};
这样你就可以这样称呼execvp
:
if (execvp(argv[0], argv) == -1)
注意:如果execvp
返回,则无论返回值是什么,都会出错。成功调用execvp
不会返回。