Праблема з cin i dup2()

Все о программировании под *nix
Anonymous

Праблема з cin i dup2()

Сообщение Anonymous »

Карацей трэба cout прогі перахапіць, прачытаць і выкарыстаць у варожых мэтах, для чаго я:

1) int pipe[2]; pipe(PIP1);
2) fork()
A) дачэрні працэс:
dup2(PIP1[1],1);
close(PIP1[1]);close(PIP1[2]);
execlp("programm with params");
/*перанакіраваў cout у pipe */
Б) Бацькоўскі працэсс:
dup2(PIP1[0],0);
close(PIP1[1]); /*перанакіраваў cin на чытаньне з pipe */
і спакойна чытаю з cin'а тое, што мне прожка ў другім працэссе выводзіць.

Увага, пытаньне! Як мне пасьля усяго гэтага вярнуць cin у зыходны стан (каб ён з клавы чытаў)???

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

Можно просто сохранить в неких переменных типа int номера оригинальных дескрипторов, полагаю...
Опыт растет прямо пропорционально выведенному из строя оборудованию

dimm_coder
Интересующийся
Сообщения: 65
Зарегистрирован: 19 авг 2003, 10:56
Откуда: Anwerpen, Belgium / Belarus
Контактная информация:

Сообщение dimm_coder »

Тут небольшой тестовый пример. Для меньшего размера я опустил проверки ошибок в некоторых мечтах и использовал gets(), так что, строки больше 128 символов не вводить :)
Создай файл text хотя бы с одной строкой.

<code>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
char line[128];

int cin_saved = dup(0);

printf("cin is normal\n");
gets(line);
printf("line = %s\n\n", line);

int filed = open("text", O_RDONLY);
if (-1 == filed) {
printf("And where's a test file?\n");
}

if (-1 == dup2(filed, 0)) {
perror("1) dup2:");
return 1;
}

setvbuf(stdin, NULL, _IONBF, 0);

printf("cin is redirected\n");
gets(line);
printf("line = %s\n\n", line);

if (-1 == dup2(cin_saved, 0)) {
perror("2) dup2:");
return 1;
}

printf("cin is restored to normal\n");
while (1) {
gets(line);
printf("line = %s\n", line);
}

return 0;
}

</code>

Т.к. ввод-вывод при использовании библиотечных ф-ций буферизованный, то либо
setvbuf(stdin, NULL, _IONBF, 0); использовать, либо после возврата к нормальному cin избавится от данных в буфере каким другим способом (считать даже можно). Это уже разбирайся и пробуй как лучше.

Ответить