我编写了一个名为call_system的函数,其行为类似于system();并使用execvp来执行命令及其选项。我目前正试图允许通过分离命令来运行多个程序,例如:
ls;echo test;cat;sort
当我硬编码值发送到我的call_system函数时,它工作正常,但是当我用“;”标记输入字符串时作为分隔符,它不起作用。我已经检查了令牌是否正确而且它们是否正确。
以下是我的代码的摘录(它显示了我试图让call_system多次运行的相关部分):
//job list
const char s[2] = ";";
char *itoken;
/* get the first token */
itoken = strtok(str2, s);
//walk through other tokens
while ( itoken != NULL){
int i = 0;
for (i = 0 ; i < strlen(itoken); i++){if (itoken[i] == '\n'){itoken[i] = '\0';}}
//call_system(itoken);
printf( "intoken: %s", itoken );
itoken = strtok(NULL, s);
}
// call_system("ls");
// call_system("cat");
运行示例:
ls;echo done;cat
pid of child = 4457
cat hello hello "world" Makefile test3
cat.c hello2~ hello "world"~ README test77
echooutput hello2.c hello world~ shell
frtest hello.c input shell.c
child 4457 exited with status = 0
intoken: ls
答案 0 :(得分:0)
你使代码变得如此复杂。
不需要在字符串中计数命令。 strtok
将通过分隔符;
为您提取命令。
const char s[2] = ";";
char *itoken;
char str2[]="ls;echo test;cat file";
/* get the first token */
itoken = strtok(str2, s);
while ( itoken != NULL){
call_system(itoken);
itoken = strtok(NULL, s);
}
还要在fgtes
之后的代码中进行一些验证。
while(1)
{
printf("STARTED AGAIN\n");
fgets(str, 81, stdin);
str[strlen(str) - 1] = '\0';
if (str[0] != '\0')
{
//rest of code
}
}
答案 1 :(得分:0)
在你的代码中尝试将f'\ n'替换为'\ n'而不是fgets函数。
像这样:
int i;
for (i = 0 ; i < strlen(str) ; ++i)
if (str[i] == '\n')
str[i] = '\0';