0
我想在c中编写一个简单的shell,我开始通过从网上抓取一些代码来进行简单解析,但是我遇到了一个问题,当我尝试用args执行命令时,例如ls -l它会忽略这个参数,system()没有考虑这些参数吗?代码如下系统调用的参数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define DELIMS " \t\r\n"
#include <errno.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *cmd;
char line[1024];
printf("Starting Omar's Shell\n");
while (1) {
printf("What can i do for you?>");
if (!fgets(line, 1024, stdin)) break;
// Parse and execute command
if (cmd = strtok(line, DELIMS)) {
// Clear errors
errno = 0;
if (strcmp(cmd, "exit") == 0) {
break;
} else {
if(system(line) !=0){
printf("An error has occured\n");
}
}
if (errno) perror("Command failed");
}
}
return 0;
}
'strtok'破坏原始行。这就是它的工作原理,它会插入''\ 0'',以便您可以遍历令牌。要么使用不同的方法,要么在使用strtok之前复制字符串。 – keltar 2015-02-08 05:59:32
我试过@CoolGuy,但它似乎没有工作,所以相反,我在我调用strtok()之前复制了字符串,而是用副本执行了命令。有没有其他方法可以解决这个问题? – Stiddi 2015-02-08 06:16:45
总有其他的方法。你可以实现非破坏性的strtok替代方法,它会将单词复制到单独的缓冲区而不是破坏原始文件。或者,如果您的shell旨在或多或少地进步,那么实施词法分析器并处理其中的令牌提取可能是一个好主意。 – keltar 2015-02-08 06:25:24