gpt4 book ai didi

c - 正在尝试执行重定向。无法理解文件描述符和 dup2

转载 作者:行者123 更新时间:2023-12-05 01:28:35 25 4
gpt4 key购买 nike

我应该实现一个具有重定向功能的 shell,但我无法弄清楚如何使用文件描述符。在我的 test.c 文件中,我正在尝试将测试从“python --version”传输到名为“out”的文件中。

int main(int argc, char *argv[], char *const envp[])
{
/***/TOKENIZER *tester;
int pid = 0;
int pipefd[2];
char buffer = 0;

pipe(pipefd);
pid = fork();
pipefd[1] = open("out", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);

if(pid == 0){
close(pipefd[1]);
dup2(pipefd[0], STDIN_FILENO);
close(pipefd[0]);
while(read(STDIN_FILENO, &buffer, 1) > 0){
write(STDOUT_FILENO, &buffer, 1);
}

close(pipefd[0]);
_exit(EXIT_SUCCESS);
}else{
close(pipefd[0]);
dup2(pipefd[1], STDOUT_FILENO);
close(pipefd[1]);

write(STDOUT_FILENO, "asdsd\n", 6);

char* ver[2];
ver[1] = "--version";
execvp("python", ver);
exit(EXIT_SUCCESS);
}
free(tester);


return 0;

编辑:意识到我正在混合重定向和管道的部分。这是我尝试运行的一些重定向代码。

int out = open("output.txt", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);

dup2(out, 1);
close(out);

char* ver[2];
ver[1] = "--version";
execvp("python", ver);
exit(EXIT_SUCCESS);

return 0;

我正在尝试将 Python 版本控制放入 output.txt,但我似乎遗漏了一些东西,因为它不起作用。

编辑 2:看起来它正在执行,但它输出到标准输出而不是 output.txt。

int out = open("output.txt", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);
dup2(out, STDOUT_FILENO);

char* ver[3];
ver[0] = "python";
ver[1] = "--version";
ver[2] = NULL;
execvp("python", ver);
perror("exec");

return 0;

最佳答案

    int pid = 0;
int pipefd[2];
char buffer = 0;

pipe(pipefd);
pid = fork();

到目前为止,还不错。您已经创建了一个管道,其两个文件描述符存储在 pipefd[0]pipefd[1] 中,并创建了一个子进程。

    pipefd[1] = open("out", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);

哦不!您只是用另一个指向名为“out”的常规文件的文件描述符(管道的写入端)覆盖了一个完美的文件描述符。

您是要进行常规文件重定向还是管道?在尝试实现 shell 之前,您至少应该知道这是两个不同的东西。如果您尝试模仿 python --version > out,那么您应该注意到该命令行中没有管道字符,那么您为什么会认为实现中涉及管道?

此外,由于您是在 fork 之后执行此操作,所以两个进程现在都在运行,并且它们都将执行打开操作,包括创建和截断副作用。那不可能是你想要的。

我会到此为止,因为在您修复这部分之前,程序的其余部分将毫无意义。

但一些随机的笔记:

  • 3-arg main 已经过时很长一段时间了。使用 getenv()environ 查找环境变量。
  • 单字节缓冲区效率不高,使用更大的缓冲区也不会更难。
  • 这很奇怪 - 不一定是致命问题,但绝对不寻常 - 在 parent 而不是 child 中执行 exec。

关于c - 正在尝试执行重定向。无法理解文件描述符和 dup2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16807245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com