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

C++

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

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

11.11.2010, 01:19. Просмотров 3222. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2010, 01:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обмен данными между процессами (C++):

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

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

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

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

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

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

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

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

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

Обмен данными через COM порт - C++ Builder
Доброго времени суток. Требуется производить обмен данными с неким устройством через СОМ порт. Сейчас использую вот такие функции: ...

ServerSocket и ClientSocket обмен данными - C++ Builder
Подскажите как обмен данными идет через SendText и ReceiveText в данных компонентах (ServerSocket и ClientSocket). А то посылаю с клиента...

Обмен данными в сети(сервер-клиент) - C++ Builder
Вопрос скорее общий, чем конкретный. Подскажите пожалуйста наиболее понятный, но в то же время современный способ создания...


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

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

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