两个进程在一个主函数中处理自己的代码行 (c++)

Two processes handling their own lines of code in one main function (c++)

所以我的任务是这样的:

程序在一个主函数中需要2个进程

注意我知道程序本身是一个进程,但是需要那样做。有一些将文件用作互斥锁(CreateFile 参数)的“提示”,这将是带有 FILE_SHARE_DELETE 的 dsShareMode | FILE_SHARE_READ | FILE_SHARE_WRITE参数。

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

为了 运行 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, 0, 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, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 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 stringLength = 0;
        for(int i=0; buffer[i]; i++)
            stringLength++;

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

假设你有一个单独的 helper.exe,你可以这样做:

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

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

这将创建两个进程,在它们的第二个参数 (argv[1]) 中看到 logger-modemonitor-mode

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

@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, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
    CreateProcess(argv[0], const_cast<char *>(cmdline2.c_str()), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &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, 0, 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, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 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;
}