Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
 Аватар для RUSya82
242 / 120 / 14
Регистрация: 15.10.2010
Сообщений: 395

Создание анонимного канала

15.04.2011, 22:01. Показов 6336. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
привет, всем! задача такова: создать две программы. Первая представляет процесс-родитель, вторая процесс потомок. Процесс - родитель создает анонимный канал, запускает потомка у которого стандартный поток ввода перенаправлен на поток ввода анонимного канала, передает данные через канал процессу-потомку. Потомок же получает данные от родителя через стандартный поток ввода, и вывод полученных данных в стандартный поток вывода.
Из всего, что я нарыл на этом форуме получилось вот что:
Процесс родитель:
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
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    STARTUPINFO si = {sizeof(si)};
    SECURITY_ATTRIBUTES sa;
    SECURITY_DESCRIPTOR sd;        //ñòðóêòóðà security äëÿ ïàéïîâ
    PROCESS_INFORMATION pi;
    char buf[1024];
    //HANDLE newstdin, write_stdin;
    HANDLE newstdread, newstdwrite, newstdwrite2, newstdread2;
    sa.lpSecurityDescriptor = NULL;
 
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = true;       //ðàçðåøàåì íàñëåäîâàíèå äåñêðèïòîðîâ
    
    if (!CreatePipe(&newstdread, &newstdwrite, &sa, 0))   //ñîçäàåì ïàéï äëÿ stdin
    {
        cout << "I can't CreatePipe";
        getch();
        return 0;
    }
 
    GetStartupInfo(&si);      //ñîçäàåì startupinfo äëÿ äî÷åðíåãî ïðîöåññà
 
    
 
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_NORMAL;
    //si.hStdOutput = newstdread;
    //si.hStdError = newstdout;   
    si.hStdInput = newstdread;    
    const char app_spawn[] = "LAB5-2.exe";
    DuplicateHandle(GetCurrentProcess(),
                          newstdwrite, GetCurrentProcess(), &newstdwrite2,
                          0, FALSE, DUPLICATE_SAME_ACCESS);
    //si.hStdOutput = newstdread;
    CloseHandle(newstdwrite);
    if (!CreateProcess(app_spawn, NULL, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
    {
        cout << "I can't CreateProcess";
        getch();
        CloseHandle(newstdread);
        CloseHandle(newstdwrite);
        return 0;
    }
 
 
    memset(buf, 'X', sizeof(buf));
    cout << buf;
    unsigned long bread;
    if(!(WriteFile(newstdwrite2, buf, 102, &bread, NULL)))
    {
       cout << "NOT WRITE";
    }
    else
    cout << "write\n";
    getch(); 
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    CloseHandle(newstdread);            
    CloseHandle(newstdwrite);
    system("PAUSE");
    return 0;
}
Процесс - потомок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <conio.h>
#include <stdio.h>
 
using namespace std;
int main()
{
    char buf[1024];
    cout << "dofijdof\n";
    scanf("%s",&buf);
    cout << buf;
    cout << "idgfvifvn";
    getch();
    return 0;
}
Потомок запускается, но не выводит на экран ничего.
Пробовал разные варианты, и что то в конец запутался.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.04.2011, 22:01
Ответы с готовыми решениями:

Не могу считать данные из анонимного канала
Доброго времени суток! Начал изучать анонимные каналы и столкнулся с проблемой. Необходимо реализовать сервер очередей. Клиент - это...

Создание информационного канала с применением сокетов
Помогите пож-та написать прогу с использованием сокетов. Прога не очень сложная, но я в ней не вижу своей ошибки... Почему-то клиент не...

Создание RSS ленты канала YouTube
Всем здрасти! Понадобилось создать RSS ленту своего канала YouTube. Посидел, погуглил и накопал следующий рецепт: ...

2
 Аватар для RUSya82
242 / 120 / 14
Регистрация: 15.10.2010
Сообщений: 395
19.04.2011, 00:14  [ТС]
Не помогли, ну и ландо. Вот, так сказать, почти конечный вариант. Буду разговаривать сам с собой, может кому и пригодится.
Процесс родитель:
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
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    // инициализируем необходимые структуры
    STARTUPINFO si = {sizeof(si)};
    SECURITY_ATTRIBUTES sa;
    PROCESS_INFORMATION pi;
    char buf[1024];
    char t= '\n';
    HANDLE newstdread, newstdwrite;//хэндлы потоков для пайпа
    //инициализируем нужные поля SECURITY_ATTRIBUTES
    sa.nLength = sizeof(sa);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = true;       //разрешаем наследование дескрипторов
    //***************создаем анонимный канал***************
    if (!CreatePipe(&newstdread, &newstdwrite, &sa, 0))   //создаем пайп для stdin
    {
        cout << "I can't CreatePipe";
        getch();
        return 0;
    }
    else
        cout << "\nPipe Created!\n";
    //******выведем на экран дескриптор потока ввода анонимного канала************
    cout << "The read HANDLE of PIPE = " << newstdread << endl;
    //******обнуляем поля STARTUPINFO и задаем нужные значения************
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_NORMAL;
    //*****подменяем стандартный дескриптор ввода, дескриптором ввода анонимного канала*****
    si.hStdInput = newstdread;
    si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    si.hStdError = si.hStdOutput; 
    TCHAR czCommandLine[] = "LAB5-2.exe";
    //TCHAR czCommandLine[] = "c:\\windows\\system32\\cmd.exe";
    if (!CreateProcess(NULL, czCommandLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
    {
        cout << "I can't CreateProcess";
        getch();
        CloseHandle(newstdread);
        CloseHandle(newstdwrite);
        return 0;
    }
    else
        cout << "\nProcess Created!!!\n";
    memset(buf, 'E', sizeof(buf));
    cout << buf;
    unsigned long bread;
    cout << "STD INPUT HANDLE = " << GetStdHandle(STD_INPUT_HANDLE) << endl;
    cout << "STD OUTPUT HANDLE = " << GetStdHandle(STD_OUTPUT_HANDLE) << endl;
    while(1)
    {
            memset(buf, 0, sizeof(buf));
            *buf = (char)getch();
            cout.put(*buf);
            if(*buf==13)
            {
                *buf = '\n';
                cout.put(*buf);
            }
            WriteFile(newstdwrite, buf, 1, &bread, NULL);
            if(*buf==27)
                 break;
    }
    TerminateProcess(pi.hProcess,0);
    
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    CloseHandle(newstdread);            
    CloseHandle(newstdwrite);
    system("PAUSE");
    return 0;
}
Процесс потомок(в качестве потомка работает и cmd):
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
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
 
using namespace std;
 
int main()
{
    char buf[1];
    unsigned long avail;
    cout << "STD INPUT HANDLE = " << GetStdHandle(STD_INPUT_HANDLE) << "\n";
    cout << "STD OUTPUT HANDLE = " << GetStdHandle(STD_OUTPUT_HANDLE) << "\n";
    unsigned long bread;    //кол-во прочитанных байт
    while(1)
    {
            PeekNamedPipe(GetStdHandle(STD_INPUT_HANDLE), NULL, NULL, NULL, &avail, NULL);
            if(avail)
            {
                     memset(buf, 0, sizeof(buf));
                     ReadFile(GetStdHandle(STD_INPUT_HANDLE), buf, 1, &bread, NULL);
                     if(*buf == 27)
                         break;
                     if(*buf == 13)
                         *buf == '\n';
                     cout << buf;
            }
    }
    return 0;
}
2
1 / 1 / 1
Регистрация: 04.03.2016
Сообщений: 4
14.04.2017, 22:13
Завтра шестилетие темы, и она все же мне пригодилась
Тут по быстрому переделал, вроде работает. Может кому еще понадобится

Процесс родитель
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
84
85
86
87
88
89
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    // èíèöèàëèçèðóåì íåîáõîäèìûå ñòðóêòóðû
    STARTUPINFO si = {sizeof(si)};
    SECURITY_ATTRIBUTES sa;
    PROCESS_INFORMATION pi;
    char buf[1024];
    char t= '\n';
    HANDLE newstdread, newstdwrite;//õýíäëû ïîòîêîâ äëÿ ïàéïà
    //èíèöèàëèçèðóåì íóæíûå ïîëÿ SECURITY_ATTRIBUTES
    sa.nLength = sizeof(sa);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = true;       //ðàçðåøàåì íàñëåäîâàíèå äåñêðèïòîðîâ
    //***************ñîçäàåì àíîíèìíûé êàíàë***************
    if (!CreatePipe(&newstdread, &newstdwrite, &sa, 0))   //ñîçäàåì ïàéï äëÿ stdin
    {
        cout << "I can't CreatePipe";
        getch();
        return 0;
    }
    else
        cout << "\nPipe Created!\n";
    //******âûâåäåì íà ýêðàí äåñêðèïòîð ïîòîêà ââîäà àíîíèìíîãî êàíàëà************
    cout << "The read HANDLE of PIPE = " << newstdread << endl;
    //******îáíóëÿåì ïîëÿ STARTUPINFO è çàäàåì íóæíûå çíà÷åíèÿ************
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_NORMAL;
    //*****ïîäìåíÿåì ñòàíäàðòíûé äåñêðèïòîð ââîäà, äåñêðèïòîðîì ââîäà àíîíèìíîãî êàíàëà*****
    si.hStdInput = newstdread;
   // si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    si.hStdOutput = newstdwrite;
    si.hStdError = si.hStdOutput; 
    TCHAR czCommandLine[] = "sum.exe";
    //TCHAR czCommandLine[] = "c:\\windows\\system32\\cmd.exe";
    if (!CreateProcess(NULL, czCommandLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
    {
        cout << "I can't CreateProcess";
        getch();
        CloseHandle(newstdread);
        CloseHandle(newstdwrite);
        return 0;
    }
    else
        cout << "\nProcess Created!!!\n";
    //memset(buf, 'E', sizeof(buf));
    //cout << buf;
    unsigned long bread;
    cout << "STD INPUT HANDLE = " << newstdread << endl;
    cout << "STD OUTPUT HANDLE = " << newstdwrite << endl;
    /*while(1)
    {
            memset(buf, 0, sizeof(buf));
            *buf = (char)getch();
            cout.put(*buf);
            if(*buf==13)
            {
                *buf = '\n';
                cout.put(*buf);
            }
            WriteFile(newstdwrite, buf, 1, &bread, NULL);
            if(*buf==27)
                 break;
    }*/
    strcpy(buf,"4 6\n");
   
    WriteFile(newstdwrite, buf, 4, &bread, NULL);
    Sleep(100);
    memset(buf, '\0', sizeof(buf));
    ReadFile(newstdread, buf, 100, &bread, NULL);
    printf ("%s\n",buf);
    TerminateProcess(pi.hProcess,0);
    
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    CloseHandle(newstdread);            
    CloseHandle(newstdwrite);
    system("PAUSE");
    return 0;
}
Процесс потомок
C++
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main () {
    int x,y;
    scanf("%d%d",&x,&y);
    printf ("%d", x+y);
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.04.2017, 22:13
Помогаю со студенческими работами здесь

Simulink создание модели канала связи. Проблемы
Добрый день! Нам в университете дали задание в Simulink Matlab Скриншот того, что должно получится (пример преподавателя)...

Дан номер телевизионного канала (от 1 до 5).Вывести на экран наиболее популярные программы заданного канала
Дан номер телевизионного канала (от 1 до 5).Вывести на экран наиболее популярные программы заданного канала.

HttpWebRequest проверка подлинности сайта и создание защищенного канала
Использую HttpWebRequest для отправки и получения данных с сайта. Подскажите пожалуйста как удостовериться, что ответ пришел именно от...

Создание локального канала сети между коммутаторами провайдера
Здравствуйте, уважаемые форумчане, возникла диллема. Имеется два офиса компании, офисы подключены к коммутаторам провайдера. Коммутаторы...

Реализация анонимного класса
ArrayList &lt;String&gt; Str = new ArrayList &lt;String&gt;(); В общем, пересмотрел кучу примеров в интернете где класс-тип коллекции (вместо...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru