Как вернуться в stdin / out после перенаправления в C - PullRequest
1 голос
/ 13 апреля 2019

Я создаю простую оболочку на C, и одной из функций является перенаправление ввода-вывода. Тем не мение; Мне трудно понять, как вернуться в stdin / stdout после завершения выполнения команды перенаправления.

Я попытался скопировать stdin / out и затем снова использовать его в основной функции, как показано в коде, но это не сработало.

void  execute(char **args, bool flag)
{
    pid_t  pid;
    int status;
    int exc;

    if ((pid = fork()) < 0) {     
        printf("forking child process failed\n");
    }

    else if (pid == 0) {          /* for the child process:         */
        if(in_flag){
            file_desc_in = open(sub2, O_RDONLY | O_CREAT);
            chmod(sub2 , S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH);
            stdinCopy = dup(STDIN_FILENO);
            dup2(file_desc_in, 0);
            close(file_desc_in);    
            in = true;

        }
        else if(out_flag){
            file_desc_out = open(sub2,O_WRONLY |O_APPEND | O_CREAT);
            chmod(sub2 , S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH);
            stdoutCopy = dup(STDOUT_FILENO);
            dup2(file_desc_out, STDOUT_FILENO);
            close(file_desc_out);           
            out = true;

        }
        exc =  execvp(args[0], args);     /* execute the command  */

        printf("exec failed!\n")
        exit(EXIT_FAILURE)

    }

    if(flag){
        pid_t childpid = wait(&status);
    }

}

эта часть в main ()

if(out){
        dup2(stdoutCopy,STDOUT_FILENO);
        close(stdoutCopy);
        out = false;    
    }
    else if(in){
        dup2(stdinCopy,STDIN_FILENO);
        close(stdinCopy);
        in = false; 
    }

Например, когда я перенаправляю вывод команды ls в какой-то файл output.txt, перенаправление работает и вывод отображается в файле, но затем все выходные данные отправляются в один и тот же файл для всех вновь введенных команд, а не отображаются на терминал.

как мне решить эту проблему?

...