Я пытаюсь получить простой переадресацию ввода/вывода, используя dup2. Я следил точно за кодом, который говорят другие люди, но до сих пор нет успеха.Перенаправление stdout, не понимаю поведения
int out = open("stdoutput", O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
printf("STANDARD OUT\n");
dup2(out, 1);
printf("SEND TO FILE\n");
dup2(1, out);
close(out);
printf("BACK TO STANDARD OUT\n");
Печатается STANDARD OUT к терминалу и SEND TO FILE BACK TO STANDARD OUT к файлу. Почему он не возвращается?
Я также хочу, чтобы файл stdout fork/exec выводил файл.
int out2 = open("execout", O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
printf("STANDARD OUT\n");
dup2(out2, 1);
if(fork() == 0)
{
execvp("time", NULL);
perror(NULL);
}
dup2(out2, 1);
close(out2);
printf("BACK TO STANDARD OUT\n");
Это выводит на терминал:
STANDARD OUT TERM_PROGRAM = Apple_Terminal: Нет такого файла или каталога 0,00 реальный 0,00 пользователя 0,00 SYS
и в файл execout, он печатает: BACK TO STANDARD OUT
Возможно, возникла некоторая дополнительная проблема с вызовом exec вовремя (не найти его, а затем распечатать его в любом случае?), Но моя основная проблема с перенаправлением ввода-вывода не работает правильно.
Заранее за вашу помощь.
Обновление: похоже, проблема связана с тем, что exec не отправляет результат в файл. Код:
int output_file = open("gcc_output", O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if(fork() == 0)
{
dup2(output_file, 1);
close(output_file);
char *args[] = {"gcc", path, NULL};
printf("THIS GOES TO FILE");
execvp(args[0], args); // gcc output, errors etc. go to terminal
perror("exec");
exit(2);
}
Выполняет ли exec, что он потерял свои файловые дескрипторы или что-то еще?
Он не переключается обратно, потому что 'out' и' 1' совпадают после первого вызова 'dup2', поэтому второй вызов' dup2' ничего не делает. – user3386109
И было бы полезно проверить результаты ваших вызовов 'dup2', чтобы подтвердить это. – WhozCraig
при вызове системных функций: 'dup2()' и 'open()', всегда проверяйте возвращаемое значение, чтобы убедиться, что операция прошла успешно. – user3629249