Переопределение стандартного вывода и стандартного ввода - PullRequest
1 голос
/ 22 ноября 2011

Я бы хотел переопределить stdout, stderr в файл и stdin из char *.Моя цель состоит в том, чтобы сделать это в C.

Когда я запускаю этот код:

int main(){
        stdout=fopen("/home/user/file.txt","w");
    printf("aaaa");
    printf("\nbbbb");
    system("/bin/bash");
    sprintf("stdin","exit");
    return 0;
}

У файла не было аргументов для строки и bash из консоли.Где ошибка ??

Ответы [ 3 ]

3 голосов
/ 22 ноября 2011

Вы не хотите назначать stdout.Вместо этого вы (вероятно) хотите использовать freopen, в вашем случае, например: freopen("/home/user/file.txt","w", stdout);

Если / когда вы выполняете всю обработку внутри, вы, как правило, лучшеот записи кода для получения FILE * в качестве параметра и передачи правильного значения.Это не работает, если у вас есть внешний код, который записывает напрямую в stdout.

Редактировать: Вероятно, я бы также упомянул еще одну серьезную проблему с freopen - нет способа восстановить его впредыдущий поток.Вы можете снова использовать freopen и знать путь, который будет записывать в консоль (или что-то еще).

1 голос
/ 22 ноября 2011

stdout не следует использовать в качестве lvalue. Попробуйте функцию fprintf () вместо printf (), чтобы получить желаемый эффект.

Что касается перенаправления stdout из bash, вы не можете просто вызвать его с помощью /usr/bin/bash >> /home/user/file.txt?

0 голосов
/ 22 ноября 2011
#include <stdio.h>
#include <stdlib.h>
#include <io.h>

int main(void){
    int ret;
    FILE *fp;
    int  stdout_bk;

    stdout_bk = dup(fileno(stdout));
    fp=fopen("/home/user/file.txt","w");
    dup2(fileno(fp), fileno(stdout));
    ret = system("/bin/bash");
    //flushall();//for vc
    fflush(stdout);//for gcc 
    fclose(fp);

    dup2(stdout_bk, fileno(stdout));//restore

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...