0

我正在用 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);

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

4

1 回答 1

0

在父进程(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 指出我忘记在 parrent 中重定向!

于 2013-03-27T19:51:59.297 回答