Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.96
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
#1

Обмен данными между процессами - C++

11.11.2010, 01:19. Просмотров 3120. Ответов 6
Метки нет (Все метки)

При создании дочернего процесса при помощи функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
BOOL CreateProcess
(
    LPCTSTR lpApplicationName,                 // имя исполняемого модуля
    LPTSTR lpCommandLine,                      // Командная строка
    LPSECURITY_ATTRIBUTES lpProcessAttributes, // Указатель на структуру SECURITY_ATTRIBUTES
    LPSECURITY_ATTRIBUTES lpThreadAttributes,  // Указатель на структуру SECURITY_ATTRIBUTES
    BOOL bInheritHandles,                      // Флаг наследования текущего процесса
    DWORD dwCreationFlags,                     // Флаги способов создания процесса
    LPVOID lpEnvironment,                      // Указатель на блок среды
    LPCTSTR lpCurrentDirectory,                // Текущий диск или каталог
    LPSTARTUPINFO lpStartupInfo,               // Указатель нас структуру STARTUPINFO
    LPPROCESS_INFORMATION lpProcessInformation // Указатель нас структуру PROCESS_INFORMATION 
);
можно ли передать необходимые данные из вызывающего процесса в дочерний и наоборот?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2010, 01:19     Обмен данными между процессами
Посмотрите здесь:

Обмен данными между процессами - C++
Добрый день! Нужно распараллелить программу. Суть в следующем: должны быть два процесса(разные функции), идущих параллельно, и второй...

Обмен данными между процессами - C++
Уважаемое сообщество, подскажите, пожалуйста, с решением такой проблемы: у меня два процесса c# и с++, и мне необходимо передавать массив...

Обмен данными между процессами, сокеты - C++ Linux
чувствую я пока вообще не врубаюсь помогите разобраться как передать данные другому процессу через сокеты #include <stdio.h> ...

Обмен данными между двумя процессами - C++
Добрый день/вечер. Усердно слушал преподавателя на паре, прошуршал много литературы дома, но так и не понял, как заюзать обмен данными...

Обмен данными между процессами в консольных приложениях - C++
Привет. Можно ли как - то обмениваться данными между двумя запущенными консольными приложениями без WinAPI и без использования файлов...

Обмен данными между процессами с помощью файлов, которые отображаются в память - C++
Классическая задача "читатели-писатели", обмен информацией должен проходить с помощью файлов, отображаемых в память. Задание уже готово, но...

Обмен сигналами между процессами - C++ Linux
/*12.Процесс 1 открывает файл ипорождает потомка 2. Процесс 1 с интервалом в 1 секунду (через alarm)посылает M сигналов SIG1 процессу 2,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
11.11.2010, 01:43     Обмен данными между процессами #2
Дочерний процесс наследует все переменные родительского:
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main (int argc, const char * argv[]) {
    int x = 17;
 
    if (fork() == 0) printf("child: %d\n", x);
    else printf("parent: %d\n", x);
    
    return 0;
}
Но если нужно по ходу работы изменять эти значения, то тут поможет взаимодействие процессов.
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
11.11.2010, 11:03     Обмен данными между процессами #3
Когда это в винде дочерние процессы начали наследовать переменные? Наследуется только таблица хендлов (только те хендлы которые разрешено наследовать).

А для обмена данными есть уйма возможностей: WM_COPYDATA, проецируемые в память файлы, сокеты...
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
11.11.2010, 13:28     Обмен данными между процессами #4
Manjak, я писал про Юникс. Думал, в винде так же.
Day
1154 / 959 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
12.11.2010, 00:21     Обмен данными между процессами #5
Цитата Сообщение от Manjak Посмотреть сообщение
Когда это в винде дочерние процессы начали наследовать переменные?
Имелись в виду видимо переменные окружения (environment)
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
12.11.2010, 00:26     Обмен данными между процессами #6
Та не, имелись ввиду обычные переменные, так как использовалась fork
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2010, 04:07     Обмен данными между процессами
Еще ссылки по теме:

Обмен сообщениями между процессами (не потоками одного процесса!!!) - C++ WinAPI
В общем есть несколько процессов (отдельных экзешников). Им необходимо вместе работать. Причем у меня есть свой класс семафора и...

Как организовать кроссплатформенный обмен данных между процессами? - Visual C++
Добрый день всем посетившим! Мне нужно передать буфер char-ов из callback-функции cUrl-а в основную программу. Причём передавать...

Обмен данными между С++ и С++ - Visual C++
Есть два проекта на С++(VS2010) - В одном генерируются числа, которые надо передавать во вторую!Подскажите как это можно реализовать!...

Обмен данными между потоками - C++ Linux
Доброе время суток. У меня встал такой вопрос: нужно из главного потока в другой послать данные. В интернете искала какими функциями для...

Обмен данными между приложениями - C++
Здравствуйте Нужна помощь Нужна программа которая будет брать некие данные из одной программы и копировать их в другую программу и...


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

Или воспользуйтесь поиском по форуму:
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
29.11.2010, 04:07  [ТС]     Обмен данными между процессами #7
Решил использовать для обмена данными FileMapping. Где то прочитал что он быстро работает. (так ли это?) Сама работа понятна с файлмэппингом. Но у меня нескольким дочерним процессам нужно будет читать/писать информацию в проецируемый в память файл. Необходимо было прикрутить какой-нибудь механизм синхронизации. Я решил сделать через семафоры.

Сам семафор в вызывающем процессе создается замечательно. НО вот незадача - пытаюсь открыть семафор в дочернем процессе при помощи функции
C++
1
2
3
4
5
HANDLE OpenSemaphore(
  DWORD dwDesiredAccess,
  BOOL bInheritHandle,
  LPCTSTR lpName
);
и не получается. OpenSemaphore возвращает NULL.

Вызывающий процесс:
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
class WINDOW : public CFrameWnd   
{
private:
    HANDLE hSemaphore;
           ...
public:
    WINDOW (int);
            afx_msg void Обработчик_кнопки ();
            DECLARE_MESSAGE_MAP();
    ~WINDOW();
};
 
BEGIN_MESSAGE_MAP(WINDOW, CFrameWnd)   
    ON_COMMAND(ид_кнопки,обработчик_кнопки)
END_MESSAGE_MAP()
 
WINDOW::WINDOW (int r)  
{
...
hSemaphore=CreateSemaphore(NULL,1,1,"WCS");
...
}
 
afx_msg void WINDOW::Обработчик_кнопки ()
{
...
STARTUPINFO cif;
ZeroMemory(&cif,sizeof(STARTUPINFO));
PROCESS_INFORMATION pi;
CreateProcess(".\\exe\\warcraft_unit.exe",NULL,NULL,NULL,false,NULL,NULL,NULL,&cif,&pi);
...
}
Вызываемый процесс(диалог в качестве главного окна):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class  MY_DIALOG: public CDialog
{
private:
    HANDLE hSem;
           ...;
public:
    MY_DIALOG ( char  * DialogName, CWnd  *Owner );
    DECLARE_MESSAGE_MAP();
           ~MY_DIALOG();
};
 
MY_DIALOG::MY_DIALOG ( char  * DialogName, CWnd  *Owner ): CDialog ( DialogName, Owner) 
{
    hSem=OpenSemaphore(NULL,false,"WCS");
    if(hSem == NULL) {
        MessageBox("Unable to open semaphore", "Error!", MB_ICONSTOP);
        exit(1);
        }
           ...
}
Что следует сделать, чтобы открыть семафор в дочернем процессе?

Добавлено через 3 часа 55 минут
ЭЭэ все разобрался в своих ошибках... на данный момент помощь не требуется.
Yandex
Объявления
29.11.2010, 04:07     Обмен данными между процессами
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru