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

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

16.03.2007, 21:11. Показов 4492. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru