gpt4 book ai didi

c - 如何在用 C 编写的 shell 中重定向 cd 的输出

转载 作者:行者123 更新时间:2023-11-30 17:53:20 25 4
gpt4 key购买 nike

我正在用 C 语言编写一个基本的 shell,我已经实现了所有重定向运算符,但是,当我尝试重定向“cd”时,我遇到了这个问题:

cd 可以完美地工作,无需任何输出重定向,但是

当我尝试做这样的事情时:

cd inexistant_directory > output_file

未创建输出文件,在 bash 中,运行该命令会重定向标准输出,正如我之前所说,使用外部命令的重定向运算符效果很好

当我遇到cd命令时,我调用

char*path = get_path(parameters);  //implemented by me, works on rest of the cases
int ret =chdir(path);

我不在子进程中调用它,而是在父进程中调用它(shell进程本身)

我做错了什么?

谢谢,

PS:我运行此程序的操作系统是 Ubuntu 12.10,但是代码符合 POSIX 标准

LE:我无法发布整个代码,因为它大约有 600 行,

这是我的逻辑

if(internal_command) {
//do quit, exit or cd
} else if (variable_assignemt){
//do stuff
} else {
// external command
pid = fork();
if(pid == -1) {
//crash
} else if (pid == 0) {
do_redirects()
call_external_cmd
}
default :
wait(pid, &status);

所以,我认为要解决这个问题,我需要在父级(shell进程)中重定向stdout并在命令执行后恢复

最佳答案

未在父进程(shell)中重定向标准输出确实是导致cd 的不良行为,我的解决方案如下:

   if(we_have_out_redirection == 1) {
if(out != NULL) {

char *outParrent = out;

fflush(stdout);

outBackup = dup(STDOUT_FILENO); //I save stdout for future restoration
int fd = open(outParrent, O_WRONLY | O_CREAT | O_TRUNC, 0644); //open output file
int rc;
rc = dup2(fd, STDOUT_FILENO); //redirect stdout

retval = chdir(out); //execute cd command

//restore stdout
close(fd);
fflush(stdout);
rc = dup2(outBackup, 1);
close(outBackup);
}
}

感谢 Jake223 指出我忘记在父级中重定向!

关于c - 如何在用 C 编写的 shell 中重定向 cd 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15667635/

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