Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C MapViewOffileOpenFileMapping(需要帮助)_C_Windows - Fatal编程技术网

C MapViewOffileOpenFileMapping(需要帮助)

C MapViewOffileOpenFileMapping(需要帮助),c,windows,C,Windows,``我正试着做作业,但我不能继续,需要你的帮助。 我有两个进程使用相同的文件(log.txt)。当我试图同时写一些东西时,它会覆盖,并且只有一个进程写入txt 这是我的创作过程 enter code here #include <Windows.h> #include <stdlib.h> #include <stdio.h> #include "..\\def.h" int main(){ HANDL

``我正试着做作业,但我不能继续,需要你的帮助。 我有两个进程使用相同的文件(log.txt)。当我试图同时写一些东西时,它会覆盖,并且只有一个进程写入txt

这是我的创作过程

enter code here
     #include <Windows.h>
    #include <stdlib.h>
   #include <stdio.h>
       #include "..\\def.h"



      int main(){

HANDLE hReadPipe;
HANDLE hWritePipe;
HANDLE hMMap;
DWORD bytesWritten;
HANDLE hFile;
STARTUPINFO si_e;
PROCESS_INFORMATION pi_e;

STARTUPINFO si_d;
PROCESS_INFORMATION pi_d;


SECURITY_ATTRIBUTES sa;

sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);

    if(!CreatePipe(&hReadPipe,&hWritePipe, &sa,0))
    fprintf(stderr,"Unable to create pipe.\n");
ZeroMemory(&si_e, sizeof(STARTUPINFO));
ZeroMemory(&si_d, sizeof(STARTUPINFO));



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

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

}



si_e.cb = sizeof(si_e);
si_e.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
si_e.hStdOutput =hWritePipe;
si_e.hStdError = GetStdHandle(STD_ERROR_HANDLE);
si_e.dwFlags = STARTF_USESTDHANDLES;

        if(!CreateProcess(  NULL,
                    "..\\Debug\\Encrypter.exe",
                    NULL,
                    NULL,
                    TRUE,
                    CREATE_NEW_CONSOLE,
                    NULL,
                    NULL,
                    &si_e,
                    &pi_e))
    fprintf(stderr,"Unable to create child process.\n");








si_d.cb = sizeof(si_d);
si_d.hStdInput= hReadPipe;
si_d.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
si_d.hStdError = GetStdHandle(STD_ERROR_HANDLE);
si_d.dwFlags = STARTF_USESTDHANDLES;

         if(!CreateProcess( NULL,
                    "..\\Debug\\Decrypter.exe",
                    NULL,
                    NULL,
                    TRUE,
                    CREATE_NEW_CONSOLE,
                    NULL,
                    NULL,
                    &si_d,
                    &pi_d))
    fprintf(stderr,"Unable to create child process.\n");



Sleep(5000000);
return 0;
在此处输入代码
#包括
#包括
#包括
#包括“.\\def.h”
int main(){
处理管道;
处理水管;
处理hMMap;
德沃德·拜特斯莱特;
处理文件;
STARTUPINFO公司;
处理信息pi;
STARTUPINFO公司;
处理信息pi;
安全(a);
sa.bInheritHandle=TRUE;
sa.lpSecurityDescriptor=NULL;
sa.nLength=sizeof(安全属性);
如果(!CreatePipe(&hReadPipe,&hWritePipe,&sa,0))
fprintf(stderr,“无法创建管道。\n”);
零内存(&si_e,sizeof(STARTUPINFO));
零内存(&si_d,sizeof(STARTUPINFO));
如果((hFile=CreateFile)(文件名,
一般的读,一般的写,
文件共享读取文件共享写入,
无效的
永远敞开心扉,
文件\u属性\u正常,
空)
==无效的\u句柄\u值){
fprintf(stderr,“父:无法打开文件%s:%d\n”,文件名,GetLastError());
exitPrompt();
}
如果((hMMap=CreateFileMapping)(hFile,
无效的
第页读写,
0,
BUFF_尺寸*2,
“全局\\文件\u日志\u txt”))
==空){
fprintf(stderr,“父级:无法创建内存映射:%d\n”,GetLastError());
}
si_e.cb=sizeof(si_e);
si_e.hStdInput=GetStdHandle(标准输入句柄);
si_e.hst输出=hWritePipe;
si_e.hStdError=GetStdHandle(标准错误句柄);
si_e.dwFlags=STARTF_USESTDHANDLES;
如果(!CreateProcess)为空,
“.\\Debug\\Encrypter.exe”,
无效的
无效的
符合事实的
创建新的控制台,
无效的
无效的
&是的,
&皮尤(e))
fprintf(stderr,“无法创建子进程。\n”);
si_d.cb=sizeof(si_d);
si_d.hStdInput=螺纹管;
si_d.hStdOutput=GetStdHandle(标准输出句柄);
si_d.hStdError=GetStdHandle(STD_ERROR_HANDLE);
si_d.dwFlags=STARTF_USESTDHANDLES;
如果(!CreateProcess)为空,
“.\\Debug\\Decrypter.exe”,
无效的
无效的
符合事实的
创建新的控制台,
无效的
无效的
&是的,
&皮尤(d))
fprintf(stderr,“无法创建子进程。\n”);
睡眠(500万);
返回0;
}

1.过程:

enter code here
       #include <stdlib.h>
     #include <stdio.h>
      #include <Windows.h>
          #include "..\\def.h"
              int main()
       {
int i;
HANDLE writeHandle;
HANDLE hFile, hMMap;
DWORD bytesToWrite,bytesWritten,a=50;
char * pFile, *start;
char message[50][15];   
char code[]=" ";
int index;
writeHandle = GetStdHandle(STD_OUTPUT_HANDLE);

    if((hMMap = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,"Global\\file_log_txt")) == NULL){
    fprintf(stderr,"Unable to create memory mapping: %d\n",GetLastError());

}

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

}

    //student number =160201007(0+0+7=7)  +7encrypter
while(1){

    gets(code);
    for(  i=0;i<strlen(code);i++){
    code[i]=code[i]+7;
}
    bytesToWrite = strlen(code);
    bytesToWrite++;
    WriteFile(writeHandle,code,bytesToWrite,&bytesWritten,NULL);

}
start = pFile;
*(pFile)=*(pFile)+50;
while(pFile < start+ 100){
        *(pFile=pFile+80);
    *(pFile++) = 'A';
    break;  
}
system("pause");
return 0;
             }
在此处输入代码
#包括
#包括
#包括
#包括“.\\def.h”
int main()
{
int i;
手柄可写手柄;
处理hFile、hMMap;
DWORD bytesToWrite,bytesToWrite,a=50;
char*pFile,*开始;
字符信息[50][15];
字符代码[]=“”;
整数指数;
writeHandle=GetStdHandle(标准输出句柄);
if((hMMap=OpenFileMapping(FILE\u MAP\u ALL\u ACCESS,FALSE,“Global\\FILE\u log\u txt”))==NULL){
fprintf(stderr,“无法创建内存映射:%d\n”,GetLastError());
}
if((pFile=(char*)MapViewOfFile(hMMap,FILE\u MAP\u ALL\u ACCESS,0,0,BUFF\u SIZE))==NULL)
{
fprintf(stderr,“无法创建映射视图:%d\n”,GetLastError());
}
//学号=160201007(0+0+7=7)+7加密机
而(1){
获取(代码);

因为(i=0;i你有很多问题:)

首先,在Windows下,内存映射文件无法扩展-这使得它们不适合写入日志文件

同一文件的多个视图应该是一致的,只要它们不引用网络位置,并且您不混合内存映射和普通文件I/O,所以应该可以编写一些工作正常的内容……但您需要某种方法来协调您的写入

恐怕无法绕过某些进程间通信来安全地做到这一点。对于标准ASCII日志文件,肯定没有,对于自定义二进制格式,您可能会使用长度前缀字符串和原子数据访问进行一些欺骗(尽管我不确定在写入内存映射文件时是否可以保证原子性),但这将是一件棘手的事情,要正确地做,因为可能会出现竞赛条件。

您能否具体说明(1)谁创建了文件映射,(2)它是如何创建的;(3)上面四行中的哪一行失败,以及(4)错误代码是什么。您应该能够编辑您的问题,而不是回答它:)
enter code here
         #include <stdlib.h>
            #include <stdio.h>
           #include <Windows.h>
                #include "..\\def.h"
          int main()

          { 

char message[80];
int index,i;
HANDLE hFile, hMMap;
char * pFile, *start;
    if((hMMap = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,"Global\\file_log_txt")) == NULL){
    fprintf(stderr,"Unable to create memory mapping: %d\n",GetLastError());

}

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

}


    for(index = 0;(message[index]=getchar()) != 0;index++);
    for(  i=0;i<strlen(message);i++){
    message[i]=message[i]-7;
                 }
    printf("Decrypter : %s\n",message);
start = pFile;
while(pFile < start + 50){

    *(pFile++) = 'A';
    break;

}
system("pause");
return 0;
           }
enter code here

          #ifndef __DEF_H
          #define __DEF_H
          #include <Windows.h>
           #include <stdio.h>
          //#include <stdlib.h>
          #define BUFF_SIZE 1024 *64
           #define FILE_NAME "log.txt"


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