С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/23: Рейтинг темы: голосов - 23, средняя оценка - 4.61
ma}{im

Как подменить дочернему процессу стандартные потоки ввода/вывода?

16.03.2007, 21:11. Показов 4453. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Операционная система: Windows
Задача: создать pipe и запустить два процесса, перенаправив стандартный вывод одного из них в стандартный ввод другого (через этот pipe).

Как я понял создать pipe можно функцией int _pipe(int *pfds, unsigned int psize, int textmode); Но вот как подменить стандартный ввод/вывод для дочесних процессов найти не могу :-(
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2007, 21:11
Ответы с готовыми решениями:

Стандартные потоки ввода/вывода
Добрый день, разбираюсь с потоками в линукс и немножечко запутался. На одном сайте пишут, что "вывод на экран представляется как...

Стандартные потоки ввода и вывода
На стандартном потоке ввода задаётся последовательность целых чисел. Каждое число последовательности не меньше -200 000 000 и не...

Как передать CredHandle дочернему процессу?
Добрый день. Пишу Web-сервер вроде IIS. Реализовал расширения cgi и isapi. По http все великолепно работает. Но с https какие-то...

2
Гость
23.03.2007, 12:08
Лучший ответ Сообщение было отмечено как решение

Решение

_pipe

Creates a pipe for reading and writing.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// crt_pipe.c
/* This program uses the _pipe function to pass streams of
 * text to spawned processes.
 */
 
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <process.h>
#include <math.h>
 
enum PIPES { READ, WRITE }; /* Constants 0 and 1 for READ and WRITE */
#define NUMPROBLEM 8
 
int main( int argc, char *argv[] )
{
 
   int fdpipe[2];
   char hstr[20];
   int pid, problem, c;
   int termstat;
 
   /* If no arguments, this is the spawning process */
   if( argc == 1 )
   {
 
      setvbuf( stdout, NULL, _IONBF, 0 );
 
      /* Open a set of pipes */
      if( _pipe( fdpipe, 256, O_BINARY ) == -1 )
          exit( 1 );
 
 
      /* Convert pipe read descriptor to string and pass as argument 
       * to spawned program. Program spawns itself (argv[0]).
       */
      itoa( fdpipe[READ], hstr, 10 );
      if( ( pid = spawnl( P_NOWAIT, argv[0], argv[0], 
            hstr, NULL ) ) == -1 )
          printf( "Spawn failed" );
 
      /* Put problem in write pipe. Since spawned program is 
       * running simultaneously, first solutions may be done 
       * before last problem is given.
       */
      for( problem = 1000; problem <= NUMPROBLEM * 1000; problem += 1000)
      {
 
         printf( "Son, what is the square root of %d?\n", problem );
         write( fdpipe[WRITE], (char *)&problem, sizeof( int ) );
 
      }
 
      /* Wait until spawned program is done processing. */
      _cwait( &termstat, pid, WAIT_CHILD );
      if( termstat & 0x0 )
         printf( "Child failed\n" );
 
 
      close( fdpipe[READ] );
      close( fdpipe[WRITE] );
 
   }
 
   /* If there is an argument, this must be the spawned process. */
   else
   {
 
      /* Convert passed string descriptor to integer descriptor. */
      fdpipe[READ] = atoi( argv[1] );
 
      /* Read problem from pipe and calculate solution. */
      for( c = 0; c < NUMPROBLEM; c++ )
      {
 
        read( fdpipe[READ], (char *)&problem, sizeof( int ) );
        printf( "Dad, the square root of %d is %3.2f.\n",
                 problem, sqrt( ( double )problem ) );
 
      }
   }
}
Sample Output
Son, what is the square root of 1000?
Son, what is the square root of 2000?
Son, what iDad, the square root of 1000 is 31.62.
Dad, the square root of 2000 is 44.72.
s the square root of 3000?
Dad, the square root of 3000 is 54.77.
Son, what is the square root of 4000?
Dad, the square root of 4000 is 63.25.
Son, what is the square root of 5000?
Dad, the square root of 5000 is 70.71.
Son, what is the square root of 6000?
SonDad, the square root of 6000 is 77.46.
, what is the square root of 7000?
Dad, the square root of 7000 is 83.67.
Son, what is the square root of 8000?
Dad, the square root of 8000 is 89.44.
ma}{im
23.03.2007, 14:04
Спасибо за ответ, НО приведённый код проблемы не решает т.к. проблема в другом.

Есть два исполняемых файла:
writer.exe - выводит некоторые сообщения в стандартный вывод
reader.exe - читает и обрабатывает сообщения из стандартного ввода
(исходных кодов данных программ НЕТ)

Необходимо написать программу посредника, которая бы запустила эти две программы, а затем брала вывод writer'а, обрабатывала его и передавала reader'у (возможно запускала бы неоднократно). Как мне кажется, лучше всего это сделать с помощью pipe'ов, но как подменить дочерним процессам стандартный ввод/вывод на созданные pipe'ы я не знаю, и не могу найти такой информации. В этом и проблема.
Помогите, пожалуйста!:confused:
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.03.2007, 14:04
Помогаю со студенческими работами здесь

Как дочернему процессу вернуть значение в родительский?
Подскажите, как дочернему процессу вернуть значение в родительский?

Как правильно закрывать потоки ввода/вывода
Приветствую, Разбираюсь с потоками ввода вывода, в частности с их закрытием, смотрю примеры и удивляюсь - везде пишут по разному. Где...

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

Стандартные библиотеки ввода/вывода
Здорова господа! Есть задание: &quot;Нужно реализовать стандартную библиотеку ввода/вывода языка Си &lt;stdio.h&gt; используя...

Стандартные функции ввода/вывода языка Си
Приветствую всех.У меня проблема.Я решил попробовать функции ввода/вывода в стиле Си.Написал прогу которая должна выводить сумму a и b,но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru