为什么代码没有将正确的数据写入输出文件 XV6

Why is the code not writting the correct data into the output file XV6

提问人:Shubham Bajaj 提问时间:11/5/2023 最后编辑:Shubham Bajaj 更新时间:11/5/2023 访问量:29

问:

我正在尝试制作一个接受 3 个操作(例如 ls、cat、echo)并将结果写入输出文件的函数。我创建了一个函数,该函数创建了 3 个新的 char 数组并将操作值存储在其中。问题是每当我调用 close(1) 时,我的代码都会一直等待并且永远不会退出。如果我注释掉那一行,那么文件就被创建了,但里面的数据是随机的。 代码如下:

`int handle_multiple_pipes(char **operation1, char **operation2, char **operation3){
int fd1[2];
if(pipe(fd1) == -1){
    return -1;
}
int status;
int pid1 = fork();
if (pid1 < 0) {
    return -1;
}
if(pid1 == 0){
    close(1);
    dup(fd1[1]);
    close(fd1[1]);
    close(fd1[0]);
    exec(operation1[0], operation1);
    exit(1);
}
int pid2 = fork();
if (pid2 < 0) {
    return -1;
}
if(pid2 == 0){
    close(0);
    dup(fd1[1]);
    close(fd1[1]);
    close(1);
    dup(fd1[0]);
    close(fd1[1]);
    exec(operation2[0], operation2);
    exit(1);
}
int pid3 = fork();
if (pid3 < 0) {
    return -1;
}
if(pid3 == 0){
    int i=0;
    int type_of_direction = 0;
    char *output_file_path = "NULL";
    while(operation3[i] != 0){
        int redirection = strcmp(operation3[i], ">");
        if (redirection == 0){
            type_of_direction = 1;
            output_file_path = operation3[i+1];
            operation3[i] = '\0';
            operation3[i+1] = '\0';
        }
        i++;
    }
    if (type_of_direction == 0){
        close(0);
        dup(fd1[0]);
        close(fd1[0]);
        close(fd1[1]);
        exec(operation3[0], operation3);
        exit(1);
    }
    else if (type_of_direction == 1){
        printf("IN HERE 0\n");
        int output_file = open(output_file_path, O_CREATE | O_WRONLY);
        printf("IN HERE 1\n");
        close(fd1[0]);
        // close(fd1[1]);
        printf("IN HERE 2\n");
        wait(&status);
        close(1);
        printf("IN HERE 3\n");
        dup(output_file);
        printf("IN HERE 4\n");
        exec(operation3[0], operation3);
        close(output_file);
        exit(1);
    }
}
close(fd1[0]);
close(fd1[1]);
wait(&status);
wait(&status);
wait(&status);
return 1;

} `

我希望在输出文件中写入正确的数据。例如: 输入: ls |grep 测试 |grep 用户 预期输出:usertests 2 15 180504 电流输出:代码永不退出。

我还尝试调试代码,执行总是在关闭(1)时停止。我在另一个函数中使用相同的执行流程,并且正在工作。我只是无法理解这段代码的问题。

C 操作系统 管道 XV6

评论


答: 暂无答案