我需要实现一个带有重定向功能的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;
ver [0]
中放置一些内容。即使Python不关心其argv [0]
,内核也需要指向合法字符串的指针,否则执行将失败。在执行后,您应该打印错误消息(即perror(“ exec”);
)而不是EXIT_SUCCESS
,因为除非出现错误,否则exec永远不会返回。您的其他系统调用也需要进行一些错误检查... - user2404501ver
的末尾放置一个NULL
,因此将其设置为3个元素长,并设置ver[2]=NULL
。 - user2404501python --version > output.txt
命令。现在可以尝试在你的 shell 提示符下执行该命令。Python 会将版本号发送到stderr
! - user2404501