C 重定向 STDIN 使用 dup2 不起作用

C redirecting STDIN not working using dup2

提问人:ahmed 提问时间:11/3/2023 最后编辑:halferahmed 更新时间:11/7/2023 访问量:31

问:

我正在制作一个简单的 shell,当我传递诸如“ls > junk.txt”之类的命令时,我希望子进程获取 ls 的内容并将它们写入 junk.txt。当我这样做时,当前创建了一个名为junk .txt的文件,并将“junk.txt”写入该文件。为什么不写 ls 的内容?我用错了 dup2 吗?

argv 数组包含写入 shell 的完整命令。argvSec 应包含所有命令,不包括“<”或“>”。

                int childExitMethod;
                pid_t spwanPID = fork();

                switch (spwanPID){
                case -1:
                    last_exit_status = 1;
                case 0:
                    token = strtok(command, " "); // Split the command into tokens
                    while (token != NULL) {//add in all tokens into arr
                        argv[i] = token;
                        token = strtok(NULL, " ");
                        i++;
                    }
                    argv[i] = NULL;

                    char* redirect_arg = NULL;
                    for (int i = 0; argv[i] != NULL; i++) {//Check if array contains any redirection
                        if (strcmp(argv[i], ">") == 0) {
                            redirect_arg = argv[i + 1];
                        } else {
                            argvSec[i2] = argv[i];
                            i2++;
                        }
                    }
                    argvSec[i2] = NULL;

                    if (redirect_arg != NULL) {
                        int fd_out = open(redirect_arg, O_WRONLY | O_CREAT | O_TRUNC, 0666);
                        if (fd_out == -1) {
                            last_exit_status = 1;
                            exit(1);
                        }
                        dup2(fd_out, STDOUT_FILENO);    //redirect output
                        close(fd_out);

                        execvp(argvSec[0], argvSec);
                    } else {
                        execvp(argv[0], argv);
                        last_exit_status = 1;
                        exit(1);
                    }
                default:
                    waitpid(spwanPID, &childExitMethod, 0); // Wait for the child
                }
C 重定向 输入 父子

评论

0赞 Cem Polat 11/3/2023
这个问题的答案对您的情况有用吗 stackoverflow.com/questions/53924800/...
0赞 ahmed 11/3/2023
@CemPolat不是真的,我已经在做那个解决方案中的事情了。
0赞 Shawn 11/3/2023
您没有将 包含在要传递给 exec 命令的参数中,但您正在传递被重定向到的文件名。所以它正在运行>ls junk.txt
0赞 ahmed 11/3/2023
@Shawn那么我是否也应该删除垃圾.txt?包含“>”会导致错误打印出“>”不是命令。同样,在我的情况下,我必须手动重定向输出。
0赞 ahmed 11/3/2023
@Shawn感谢您的评论,删除垃圾.txt并且只运行 ls 有效。

答: 暂无答案