Форум программистов, компьютерный форум, киберфорум
Van111
Войти
Регистрация
Восстановить пароль
Оценить эту запись

безымянные пейпы и с чем их едят

Запись от Van111 размещена 09.05.2012 в 17:04
Обновил(-а) Van111 10.05.2012 в 17:27

в этой статье я использую обычные безымянные пейпы. этот пример показывает как одно приложение(вин 32 или консоль) может взаимодействовать с другой консолью. зачем это надо? ответ очень прост - некоторые часто встречаются с ситуациями когда приходится работать с консольными приложениями выполняющие сложные функции, постоянно вводить одни и те же строки и команды и не всегда это удаётся сделать через бат файл, тем более если нам надо получить какие то значения, а с использованием пейпов вы легко можете заменить ручной набор на программный. вот вам самый элементарный и простой пример
я воздержусь от комментариев которые были в методичке так как они ни чего толком не объясняют
несколько вещей которых надо понимать
SI.dwFlags=STARTF_USESTDHANDLES; прочитайте что это такое и помёте почему SA и SI настроены именно так

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
#include "windows.h"
#include <iostream>
#include <stdlib.h>
const int leight_buf=256;
using namespace std;
int main(void)
{
char buf[leight_buf];
int ok;
DWORD Q;
SECURITY_ATTRIBUTES SA;
HANDLE RD1, WR1;
STARTUPINFO SI;
PROCESS_INFORMATION PI;
 
SA.nLength=sizeof(SECURITY_ATTRIBUTES);
SA.lpSecurityDescriptor=NULL;
SA.bInheritHandle=TRUE;
CreatePipe(&RD1, &WR1, &SA, 0);
 
memset(&SI,0,sizeof(STARTUPINFO));
SI.dwFlags=STARTF_USESTDHANDLES;
SI.hStdInput=RD1;
SI.hStdOutput=WR1;
SI.hStdError=GetStdHandle(STD_ERROR_HANDLE);
SI.cb=sizeof(STARTUPINFO);
 
CreateProcess(NULL,"child.exe",NULL,NULL,TRUE,NULL,NULL,NULL,&SI,&PI);
 
 
strcpy(buf,"Hello pipe");
ok=strlen(buf);
buf[ok]=10;
buf[ok+1]=13;
buf[ok+2]=0;
//сформировали строку ввода, ничего интересного для бывалых кодеров
WriteFile(WR1,buf,strlen(buf)+1,&Q,NULL);
Sleep(300);
//хехе ввод  асинхронный если будете работать с чужой консолью ,просто вставляйте маленький слип
ReadFile(RD1,buf,leight_buf,&Q,NULL);
// кстати чтение тоже асинхронное
buf[strlen(buf)]=0;
//консольный вывод 0 не подставляет ))
cout <<buf;
CloseHandle(RD1);
CloseHandle(WR1);
 
 
 
system("pause"); 
return 0;    
}
вот дочерний процесс child, абсолютно ничего интересного
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
using namespace std;
 
 
int main(int argc, char *argv[])
{
    char a[256];
    memset(a,0,256)
    cin>>a;
    cout <<a <<endl;
    
 
    return 0;
}
с нетерпением жду коментариев
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Я Вас расстрою, но эту запись называть статьей как-то странно. Обычно статьи структурированы (имеют план. Типа "введение, зачем это нужно, как создавать такие вещи, примерчик")

    Насчет "зачем это нужно". Я сделал вывод, что безымянные пайпы применяются только для консольного ввода/вывода. И все что-ли?

    Порадовала вот эта цитата:
    > прочитайте что это такое и помёте почему SA и SI настроены именно так
    Хотя бы ссылку привели.

    Вот это странно:
    C++
    1
    
    SI.hStdInput=RD2;
    Делаем пайп, дескриптор заносим в RD1. А вот здесь пытаемся использовать RD2.

    В коде должны присутствовать проверки на результаты вызовов функций (если результат возвращается). Это правило.

    Дальше влом.
    Запись от Евгений М. размещена 10.05.2012 в 06:49 Евгений М. вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru