【发布时间】:2013-10-22 17:13:26
【问题描述】:
我正在尝试创建一个 shell,但在尝试用用户输入填充 *argv[] 数组时遇到了麻烦。我调用我的解析函数,并将每个单词存储到一个二维数组中。我尝试了许多不同的方法将它直接存储到 *argv[] 中,但最终决定尝试使用 2d 数组。无论如何用指向存储在二维数组中的字符串的指针填充 *argv[] 吗?或者用指向字符串的指针填充 *argv[] 而不使用二维数组?
我尝试了很多其他方法,但我目前的尝试是调用 parse 函数后的 while 循环。
int main() {
int status, fRedirect, i;
pid_t pid;
char s[STORAGE];
char p[MAXITEM][STORAGE];
char *argv[MAXITEM];
for(;;) {
printf("\2: ");
scanf("%s", s);
parse(s, p);
while(p[i] != '\0') {
args[i] = *p[i];
}
if(p[0] == EOF)
break;
if(p[0] == '\0')
continue;
pid = fork();
if(pid == 0) {
if(execvp(*p, p) == -1) {
printf("Execution failed!\n");
exit(9);
}
}
if(pid != 0) {
wait(-1, &status, 0);
}
else {
fRedirect = open("/dev/null", O_WRONLY);
dup2(fRedirect, STDOUT_FILENO);
}
}
/*killpg(getpid(), SIGTERM);*/
printf("p2 terminated. \n");
exit(0);
}
void parse(char *s, char p[][STORAGE]) {
int i, j = 0;
while(*s != EOF && *s != '&' && *s != '\n' && *s != ';' && *s != '\0') {
for(i=0; i < strlen(s); i++)
p[j][i] = s[i];
i = i+getword(s);
j++;
}
}
【问题讨论】:
-
提示:您的解析函数应该从 s 填充 argv,可能对每个条目使用 strdup,然后您的 execvp 应该看起来像 execvp(argv[0], argv);。请注意,从 scanf 扫描的字符串永远不会包含 EOF。
-
在上面的评论中我应该说“strtok 和 strdup”而不仅仅是 strdup
-
我的解析函数应该返回 char ** 吗?还是它也在解析函数之外填充?
-
好奇,是否要求您在主函数中填写
*argv[]?还是可以从命令行与argc一起填写?如果您需要在 main() 中填充它,那么我相信您需要先进行一些内存分配。如果以传统方式使用,主函数定义会在从命令行读取参数时为您处理。 -
进行了全面检查,现在 argv 似乎充满了争论。我试图发布我更新的代码作为答案,但我不能再等 5 个小时,因为我没有足够的声誉!我会在晚上结束时将其发布回来。 @ryyker 我想使用 argv[] 来执行命令,我现在正在处理。