Перенаправление stdin и stdout от C

Вы также можете использовать функцию reviver для фильтрации.

var data = JSON.parse(jsonString, function reviver(key, value) {
   //your code here to filter
});

для получения дополнительной информации см. JSON.parse

61
задан Chris Lutz 25 February 2009 в 05:55
поделиться

6 ответов

Почему использование freopen() ? Спецификация C89 имеет ответ в одном из примечаний для раздела по <stdio.h>:

116. Основное использование freopen функция состоит в том, чтобы изменить файл, связанный со стандартным текстовым потоком ( stderr , stdin , или stdout ), поскольку те идентификаторы не должны быть модифицируемым lvalues, которому значение, возвращенное fopen может быть присвоена функция.

freopen обычно неправильно используется, например, stdin = freopen("newin", "r", stdin);. Это не более портативно, чем fclose(stdin); stdin = fopen("newin", "r");. Оба выражения пытаются присвоить [1 110], который, как гарантируют, не будет присваиваемым.

правильный способ использовать freopen состоит в том, чтобы опустить присвоение: freopen("newin", "r", stdin);

80
ответ дан bk1e 7 November 2019 в 13:38
поделиться

функция OS dup2 () должен обеспечить то, в чем Вы нуждаетесь (если не ссылки на точно, в чем Вы нуждаетесь).

Строго говоря, Вы можете dup2 () stdin дескриптор файла к другому дескриптору файла, сделать другой материал с stdin и затем скопировать его назад, когда Вы хотите.

дубликат () функция копирует открытый дескриптор файла. А именно, это предоставляет альтернативный интерфейс услуге, предоставленной fcntl () функция с помощью постоянного значения команды F_DUPFD, с 0 для его третьего аргумента. Дублированный дескриптор файла совместно использует любые блокировки с оригиналом.

На успехе, дубликат () возвращает новый дескриптор файла, который имеет следующее вместе с оригиналом:

  • Тот же открытый файл (или канал)
  • Тот же указатель файла (оба дескрипторов файлов совместно используют один указатель файла)
  • Тот же режим доступа (чтение, запишите, или чтение-запись)
9
ответ дан gahooa 7 November 2019 в 13:38
поделиться

Я думаю, что Вы ищете что-то как freopen()

16
ответ дан thefourtheye 7 November 2019 в 13:38
поделиться
freopen("/my/newstdin", "r", stdin);
freopen("/my/newstdout", "w", stdout);
freopen("/my/newstderr", "w", stderr);

... do your stuff

freopen("/dev/stdin", "r", stdin);
...
...

Это достигает максимума игла на моем round-peg-square-hole-o-meter, что Вы пытаетесь выполнить?

Редактирование:

Помнят, что stdin, stdout и stderr являются дескрипторами файлов 0, 1 и 2 для каждого недавно созданного процесса. freopen () должен сохранить тот же fd's, просто присвоить новые потоки им.

Так, хороший способ гарантировать, что это на самом деле делает то, что Вы хотите, чтобы он сделал, был бы:

printf("Stdout is descriptor %d\n", fileno(stdout));
freopen("/tmp/newstdout", "w", stdout);
printf("Stdout is now /tmp/newstdout and hopefully still fd %d\n",
   fileno(stdout));
freopen("/dev/stdout", "w", stdout);
printf("Now we put it back, hopefully its still fd %d\n",
   fileno(stdout));

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

Это переопределило бы любое перенаправление оболочки, поскольку не будет ничего, чтобы оболочка перенаправила. Однако его, вероятно, попытка повредить каналы. Вы могли бы хотеть убедиться настроить обработчик для SIGPIPE, в случае, если Ваша программа оказывается на блокирующемся конце канала (не FIFO, канал).

Так./your_program - stdout /tmp/stdout.txt - stderr /tmp/stderr.txt должен быть легко выполнен с freopen () и хранение тех же фактических дескрипторов файлов. То, что я не понимаю, - то, почему необходимо было бы отложить их однажды изменение их? Конечно, если бы кто-то передал любую опцию, то они хотели бы, чтобы она сохранилась до завершенной программы?

9
ответ дан Tim Post 7 November 2019 в 13:38
поделиться

freopen решает легкую часть. Имение в наличии старого stdin не трудно, если Вы ничего не считали и если Вы готовы использовать системные вызовы POSIX как dup или dup2. Если Вы запускаетесь для чтения из него, все ставки выключены.

, Возможно, можно ли сказать нам контекст, в котором происходит эта проблема?

я поощрил бы Вас придерживаться ситуаций, где Вы готовы отказаться старый stdin и stdout и можете поэтому использовать freopen.

3
ответ дан Norman Ramsey 7 November 2019 в 13:38
поделиться

Это модифицированная версия метода Тима Поста; Я использовал / dev / tty вместо / dev / stdout. Я не знаю, почему это не работает со стандартным выводом (это ссылка на / proc / self / fd / 1):

freopen("log.txt","w",stdout);
...
...
freopen("/dev/tty","w",stdout);

При использовании / dev / tty вывод перенаправляется на терминал, с которого было запущено приложение.

Надеюсь, эта информация будет полезной.

10
ответ дан 24 November 2019 в 16:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: