为什么exec()在Xv6子分叉中不起作用?

ca1c2owp  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(121)

我是一个使用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


它似乎工作正常时,它不是在儿童叉。将感谢任何帮助与此!

jaql4c8m

jaql4c8m1#

如果xv6 exec函数与Posix exec*函数类似,接受char*数组,则最后一个指针应指向NULL
最后一个指针str[1]没有初始化,所以它可以指向任何地方,程序将(如果指针没有指向NULL)有 undefined behavior
补充说明:

str[1] = NULL;

字符串
然后再调用

exec(str[0], str);


并且在调用exec * 之后添加perror(str[0]); *,以获得关于为什么它不能启动程序的线索,以防它仍然失败。
另一种选择是在定义str时初始化 all 指针:

char *str[2] = {0};


或者跳过整个复制到cmdstr

char *str[2] = {buf}; // the second char* will be NULL


但是:习惯上要为你启动的程序提供程序名,所以我建议:

char *str[3] = {buf, buf}; // the third char* will be NULL

相关问题