两个进程在一个主要函数中处理自己的代码行C ++

问题描述

所以我的任务是这样的:

程序在一个主要功能中需要2个进程

请注意,我知道程序本身是一个过程,但需要这样做。有一些“技巧”可以将文件用作互斥体(CreateFile参数),该文件将是带有FILE_SHARE_DELETE的dsShareMode。 FILE_SHARE_READ | FILE_SHARE_WRITE参数。

现在的问题是,如何创建2个进程来处理自己的代码行?我看过很多CreateProcess函数的示例,但我不太了解此函数的前两个参数

  • lpApplicationName 和
  • lpCommandLine

我应该传递给它什么以运行2个进程,一个进程处理用户输入,另一个进程作为“监视器”?

一个过程旨在处理这些代码行:

        std::string buffer;
        std::cout << "Enter your text:" << std::endl;
        getline(std::cin,buffer);
        HANDLE hFile = CreateFile("log.txt",FILE_APPEND_DATA,FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,OPEN_ALWAYS,FILE_ATTRIBUTE_norMAL,0);
        DWORD written = 0;
        WriteFile(hFile,buffer.c_str(),buffer.size(),&written,NULL);

第二个过程只在乎此:

hFile = CreateFile("log.txt",FILE_READ_ATTRIBUTES,OPEN_EXISTING,0);
        if (hFile == INVALID_HANDLE_VALUE)
        {
            std::cout << "CreateFile error " << GetLastError() << std::endl;
        }
        else
        {
            DWORD size = GetFileSize(hFile,NULL);
            std::cout << "\nCurrent file size: " << size << std::endl;
            CloseHandle(hFile);
        }

        int stringLenght = 0;
        for(int i=0; buffer[i]; i++)
            stringLenght++;

            std::cout << "\nCharacters given since last startup: " << stringLenght << std::endl;

解决方法

假设您有单独的helper.exe,则可以执行以下操作:

CreateProcess(nullptr,"helper logger-mode",...)

CreateProcess(nullptr,"helper monitor-mode",...)

这将创建两个在其第二个参数(logger-mode)中看到monitor-modeargv[1]的进程。

,

该问题似乎要求将相同的程序作为两个单独的进程运行。如果是这样,该程序将需要处理命令行参数并相应地调整其功能。

,

@Botje我已经做到了类似的事情。您能告诉我这种解决方案是否可以接受吗?

int main(int argc,char *argv[])
{
std::string cmdline1 = "main Proc1";
std::string cmdline2 = "main Proc2";
std::string buffer;
HANDLE hFile;

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si,sizeof(si));
    ZeroMemory(&pi,sizeof(pi));

    si.cb = sizeof(si);
    CreateProcess(argv[0],const_cast<char *>(cmdline1.c_str()),NULL,FALSE,CREATE_NEW_CONSOLE,&si,&pi);
    CreateProcess(argv[0],const_cast<char *>(cmdline2.c_str()),&pi);

if(strcmp(argv[1],"Proc1"))
{
    while(1)
    {
        std::cout << "Enter your text:" << std::endl;
        getline(std::cin,buffer);
        hFile = CreateFile("log.txt",FILE_APPEND_DATA,FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
        DWORD written = 0;
        WriteFile(hFile,buffer.c_str(),buffer.size(),&written,NULL);
    }
}

if(strcmp(argv[1],"Proc2"))
{
    DWORD charactersGiven = 0;
    while(1)
    {
        hFile = CreateFile("log.txt",GENERIC_READ,OPEN_EXISTING,0);
            if (hFile == INVALID_HANDLE_VALUE)
            {
                std::cout << "CreateFile error " << GetLastError() << std::endl;
            }
            else
            {
                DWORD size = GetFileSize(hFile,NULL);
                std::cout << "\nCurrent file size: " << size << std::endl;
                if(charactersGiven == 0)
                charactersGiven = size;

                std::cout << "Characters given since last startup: " << size - charactersGiven << std::endl;
            }
            Sleep(4000);
        }
}
return 0;
}