我是一个使用C和Xv 6的新手。我试图在Xv 6中创建一个可以运行简单命令的shell。然而,当我使用fork()时,我的exec()函数似乎什么都不做。
产品编号:
#include "kernel/types.h"
#include "user/user.h"
int getCmd(char *buf, int buflen){
fprintf(1, ">>>");
gets(buf, buflen);
printf("%s", buf);
if (buf[0] == '\n' || buf[0] == ' ')
{
fprintf(2, "Please enter a command \n");
return 0;
}
return 1;
}
int forking(void){
int pid;
pid = fork();
if (pid < 0){
fprintf(2, "fork failed");
exit(0);
}
return pid;
}
void exec_line(char *buf){
char cmdstr[10][10];
for (int i = 0; i < strlen(buf); i++)
{
cmdstr[0][i] = buf[i];
}
char *str[2];
cmdstr[0][(strlen(cmdstr[0]) - 1)] = '\0';
str[0] = cmdstr[0];
printf("HRE1 %s,\n", str[0]);
exec(str[0], str);
printf("HRE2 %s,\n", str[0]);
exit(0);
}
int main(int argc, char *argv[])
{
char buf[512];
int buflen = sizeof(buf);
int a = 0;
while (a == 0){
if (getCmd(buf,buflen) == 1){
if (forking() == 0){
exec_line(buf);
} else{
wait(0);
}
}
}
exit(0);
}
字符串
输出量:
>>>ls
ls
HRE1 ls
HRE2 ls
型
它似乎工作正常时,它不是在儿童叉。将感谢任何帮助与此!
1条答案
按热度按时间jaql4c8m1#
如果xv6
exec
函数与Posixexec*
函数类似,接受char*
数组,则最后一个指针应指向NULL
。最后一个指针
str[1]
没有初始化,所以它可以指向任何地方,程序将(如果指针没有指向NULL
)有 undefined behavior。补充说明:
字符串
然后再调用
型
并且在调用
exec
* 之后添加perror(str[0]);
*,以获得关于为什么它不能启动程序的线索,以防它仍然失败。另一种选择是在定义
str
时初始化 all 指针:型
或者跳过整个复制到
cmdstr
:型
但是:习惯上要为你启动的程序提供程序名,所以我建议:
型