Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.59/27: Рейтинг темы: голосов - 27, средняя оценка - 4.59
153 / 137 / 34
Регистрация: 23.05.2009
Сообщений: 275
1

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

11.11.2010, 01:19. Просмотров 5666. Ответов 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 
);
можно ли передать необходимые данные из вызывающего процесса в дочерний и наоборот?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2010, 01:19
Ответы с готовыми решениями:

Обмен данными между потоками
Здравствуйте уважаемые форумчане! Реализую многопоточное приложение. Один поток в реальном времени...

Обмен данными между компьютером и ПЛК по TCP
Добрый день! Подскажите пожалуйста, реально ли написать программу на C++ Builder для получения...

Обмен данными между C++ Builder и Java компонентами socket-ов
Всем доброго времени суток. Не знаю, следует-ли создавать эту тему именно в данном разделе, т.к....

Обмен данными между RAD Studio Berlin и cmd
Всем привет. Как реализовать обмен данными между C++ и cmd. Отправляю команду в консоль, а из...

6
268 / 170 / 11
Регистрация: 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;
}
Но если нужно по ходу работы изменять эти значения, то тут поможет взаимодействие процессов.
1
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
11.11.2010, 11:03 3
Когда это в винде дочерние процессы начали наследовать переменные? Наследуется только таблица хендлов (только те хендлы которые разрешено наследовать).

А для обмена данными есть уйма возможностей: WM_COPYDATA, проецируемые в память файлы, сокеты...
1
268 / 170 / 11
Регистрация: 14.03.2010
Сообщений: 501
11.11.2010, 13:28 4
Manjak, я писал про Юникс. Думал, в винде так же.
0
Day
1169 / 979 / 83
Регистрация: 29.10.2009
Сообщений: 1,386
12.11.2010, 00:21 5
Цитата Сообщение от Manjak Посмотреть сообщение
Когда это в винде дочерние процессы начали наследовать переменные?
Имелись в виду видимо переменные окружения (environment)
0
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
12.11.2010, 00:26 6
Та не, имелись ввиду обычные переменные, так как использовалась fork
0
153 / 137 / 34
Регистрация: 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 минут
ЭЭэ все разобрался в своих ошибках... на данный момент помощь не требуется.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.11.2010, 04:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Обмен данными между программой и сервисом через NamedPipe
Всем доброго времени суток. Друзья, у меня такая проблема: Создаю сервис, на OnExecute создаю...

Обмен данными через интернет
Доброго времени суток!!! При помощи чего реализовать обмен данными между компьютерами через...

Обмен данными по сети интернет
Возник такой вопрос, каким образом можно оганизовать обмен данными между двумя программами по сети...

ServerSocket и ClientSocket обмен данными
Подскажите как обмен данными идет через SendText и ReceiveText в данных компонентах (ServerSocket и...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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