#pragma data_seg(".shared")
#pragma comment(linker,"/SECTION:.shared,RWS")
__declspec(allocate(".shared")) long a;
разделяемые сегменты
2 процессы "общаются" через общий (разделяемй) сегмент (shared segment)
в каком русле копать? =)
Цитата:
Originally posted by MasterKlass
Есть задание.
2 процессы "общаются" через общий (разделяемй) сегмент (shared segment)
в каком русле копать? =)
Есть задание.
2 процессы "общаются" через общий (разделяемй) сегмент (shared segment)
в каком русле копать? =)
Для процессов, запускаемых с идентичного экзешника можно сделать так(а также для dll):
Код:
Здесь а будет находиться в разделяемой секции PE-файла.
Для процессов от различный экзешников можно задействовать
File mapping
Цитата:
Originally posted by k3Eahn
Для процессов, запускаемых с идентичного экзешника можно сделать так(а также для dll):
Здесь а будет находиться в разделяемой секции PE-файла.
Для процессов от различный экзешников можно задействовать
File mapping
Для процессов, запускаемых с идентичного экзешника можно сделать так(а также для dll):
Код:
#pragma data_seg(".shared")
#pragma comment(linker,"/SECTION:.shared,RWS")
__declspec(allocate(".shared")) long a;
#pragma comment(linker,"/SECTION:.shared,RWS")
__declspec(allocate(".shared")) long a;
Здесь а будет находиться в разделяемой секции PE-файла.
Для процессов от различный экзешников можно задействовать
File mapping
отлично. File Mapping не подходит, а #pragma самое то вроде...
Но я наверное просто не понимаю..
CreateProcess() создает отдельный процесс. Но ЧТО этот процесс будет выполнять?
Мне надо, чтобы один процесс что-то записал в этц перменную а, а другой считал..
Синхронизация доступа к переменной.
только как мне запустить процесс.. с какими параметрами?
и как же процесс получит доступ к разделяемой переменной?
не могу понять как это в коде будет выглядеть...
главные вопросы..
Какой процесс мне нужно создать?..
Как он получит доступ к разделяемой перменной?
[/SIZE][SIZE=2]:confused:[/SIZE]
Код:
#include <conio.h>
#include <stdio.h>
#include <windows.h>
HANDLE hMutex;
#pragma bss_seg(".shared")
#pragma comment(linker,"/SECTION:.shared,RWS")
char sharedbuf[1];
void main(void)
{
hMutex=CreateMutex(NULL,TRUE,"MUTANT4SHAREDSECTION");
if(GetLastError()!=ERROR_ALREADY_EXISTS)
{
printf("Enter something(up to 4095 symbols"\
"or failure may occur) then launch the same exe:\n");
gets(sharedbuf);
}
else
printf("You've entered:\n%s",sharedbuf);
getch();
CloseHandle(hMutex);
}
#include <stdio.h>
#include <windows.h>
HANDLE hMutex;
#pragma bss_seg(".shared")
#pragma comment(linker,"/SECTION:.shared,RWS")
char sharedbuf[1];
void main(void)
{
hMutex=CreateMutex(NULL,TRUE,"MUTANT4SHAREDSECTION");
if(GetLastError()!=ERROR_ALREADY_EXISTS)
{
printf("Enter something(up to 4095 symbols"\
"or failure may occur) then launch the same exe:\n");
gets(sharedbuf);
}
else
printf("You've entered:\n%s",sharedbuf);
getch();
CloseHandle(hMutex);
}
P.S.:Думаю, суть выше приведённого кода понятна.
Только вот вопрос про второй процесс.. Это мне нужно отдельно создавать ехе-шник чтоли? или какой процесс создавать???
а Вы не пробовали посмотреть как работает приведённый выше код?
(Подсказка: там нужно запустить собранный exe, ввести строчку, нажать Enter и не завершая этого процесса запустить с этого же exe новый процесс.)
[QUOTE=MasterKlass]Только вот вопрос про второй процесс.. Это мне нужно отдельно создавать ехе-шник чтоли? или какой процесс создавать???[/QUOTE]
Я не телепат...
я в курсе как работает код выше.
спасибо за помощь, но можно было и помягче.
Задавайте конкретный вопрос, если хотите быстро получить ответ, который Вас устроит.
With best regards, k3Eahn.
1. почему до 4095 символов можно ввести?
2. работа с мьютексами немного непонятна... Мы в каждом процессе создаём мьютекс?
1. почему до 4095 символов можно ввести?
[/QUOTE]
Разделяемая секция будет отображена на одну страницу в 4 кБ в линейном адресном пространстве процесса, поэтому можно ввести 4095 сиволов+1 завершающий ноль.
А за этой секцией могут, например находиться другие страницы других
секций которые не имеют аттрибута записи, или вообще не выделены, или что-нибудь ещё.
[QUOTE=MasterKlass]
2. работа с мьютексами немного непонятна... Мы в каждом процессе создаём мьютекс?[/QUOTE]
Мьютекс создаётся с таким именем тогда, когда нет объекта-мьютекса с таким же именем.
Если же мьютекс с таким именем существует, то CreateMutex просто вернёт его хэндл, а GetLastError вернёт ERROR_ALREADY_EXISTS.
Спасибо большое.