gpt4 book ai didi

c - 如何在C(Windows)中访问父进程创建的内存映射文件

转载 作者:行者123 更新时间:2023-11-30 15:42:02 25 4
gpt4 key购买 nike

我创建了映射文件并从父进程的 View 中读取。但是,我无法使子进程访问内存映射文件。您能检查下面的代码并帮我弄清楚吗?

这是我的子进程代码:

#include <Windows.h>
#include <stdio.h>
#define SIZE 1024 *40
int main(){

HANDLE hLogMap;
char* pView, *start;

if((hLogMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "a.txt")) == NULL)
{
fprintf(stderr,"Unable to open memory mapping: %d\n", GetLastError());
}

if((pView = (char *) MapViewOfFile(hLogMap, FILE_MAP_ALL_ACCESS, 0, 0, SIZE)) == NULL)
{
fprintf(stderr,"Unable to create map view: %d\n", GetLastError());

}


start=pView;

while(pView < start + SIZE){
fprintf(stderr,*(pView++));
pView++;
}

system("pause");

return 1;

}

这是父代码:

#include <Windows.h>
#include <stdio.h>
#define BUFF_SIZE 1024 *40
#define FILE_NAME "a.txt"

void exitPrompt(){
system("pause");
exit(0);
}

void main(){

STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
char* lpCommandLine="child.exe";
HANDLE hFile, hMMap, handle;
char * pFile, * start, *rFile;

SecureZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
SecureZeroMemory(&pi, sizeof(PROCESS_INFORMATION));

sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);

if (!CreateProcess(NULL, lpCommandLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
{
printf("unable to create new process!");
system("pause");
exit(0);
}
else
{
printf("parent is now working!\n");
handle = pi.hProcess;
}

if((hFile = CreateFile( FILE_NAME,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE|FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL))
== INVALID_HANDLE_VALUE){
fprintf(stderr,"Unable to open file %s: %d\n",FILE_NAME,GetLastError());
exitPrompt();
}

if((hMMap = CreateFileMapping( hFile,
&sa,
PAGE_READWRITE,
0,
BUFF_SIZE,
NULL))
== NULL){
fprintf(stderr,"Unable to create memory mapping: %d\n",GetLastError());
exitPrompt();
}

if( ( pFile = (char *) MapViewOfFile( hMMap,
FILE_MAP_WRITE,
0,
0,
BUFF_SIZE))
== NULL)
{
fprintf(stderr,"Unable to create map view: %d\n",GetLastError());
exitPrompt();
}
start = pFile;
while(pFile < start + BUFF_SIZE){
*(pFile++) = 'f';
*(pFile++) = 'i';
*(pFile++) = 'g';
*(pFile++) = 'e';
*(pFile++) = 'n';
*(pFile++) = 'g';
*(pFile++) = '_';
*(pFile++) = 10; //in ascii 10 is new line
}

if( ( rFile = (char *) MapViewOfFile( hMMap,
FILE_MAP_READ,
0,
0,
BUFF_SIZE))
== NULL)
{
fprintf(stderr,"Unable to create map view: %d\n",GetLastError());
exitPrompt();
}


rFile=start;

/*while(rFile < start + BUFF_SIZE){
printf("%c",*(rFile));
rFile++;
}*/

WaitForSingleObject(handle,INFINITE);

CloseHandle(handle);
CloseHandle(pi.hThread);

CloseHandle(hMMap);
CloseHandle(hFile);


exitPrompt();
}

最佳答案

OpenFileMapping 需要映射名称而不是文件本身。

if((hLogMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "mapping")) == NULL)
...

创建映射时,请在 CreateFileMapping 中提供映射名称。

if((hMMap = CreateFileMapping(  hFile,
&sa,
PAGE_READWRITE,
0,
BUFF_SIZE,
"mapping"))
== NULL){
fprintf(stderr,"Unable to create memory mapping: %d\n",GetLastError());

可以在您的 child 和 parent 之间共享映射名称并使用随机名称。

关于c - 如何在C(Windows)中访问父进程创建的内存映射文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20349188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com