Карацей трэба 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 у зыходны стан (каб ён з клавы чытаў)???
Праблема з cin i dup2()
-
- Интересующийся
- Сообщения: 65
- Зарегистрирован: 19 авг 2003, 10:56
- Откуда: Anwerpen, Belgium / Belarus
- Контактная информация:
Тут небольшой тестовый пример. Для меньшего размера я опустил проверки ошибок в некоторых мечтах и использовал 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 избавится от данных в буфере каким другим способом (считать даже можно). Это уже разбирайся и пробуй как лучше.

Создай файл 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 избавится от данных в буфере каким другим способом (считать даже можно). Это уже разбирайся и пробуй как лучше.