C语言 如何解析链表元素,以便我可以使用它们来执行命令



我正在尝试使用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不会返回。

相关内容

  • 没有找到相关文章

最新更新