两个进程在一个主函数中处理自己的代码行 (c++)
Two processes handling their own lines of code in one main function (c++)
所以我的任务是这样的:
程序在一个主函数中需要2个进程
- 第一个进程创建或打开一个文件“log.txt”,该文件位于程序所在的同一目录中。然后它将用户输入添加到该文件。
- 第二个进程是此文件的“监视器”。它检查文件是否存在,显示其大小并显示自第二个进程启动以来输入的字符数。
注意我知道程序本身是一个进程,但是需要那样做。有一些将文件用作互斥锁(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, 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-mode
或 monitor-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;
}
所以我的任务是这样的:
程序在一个主函数中需要2个进程
- 第一个进程创建或打开一个文件“log.txt”,该文件位于程序所在的同一目录中。然后它将用户输入添加到该文件。
- 第二个进程是此文件的“监视器”。它检查文件是否存在,显示其大小并显示自第二个进程启动以来输入的字符数。
注意我知道程序本身是一个进程,但是需要那样做。有一些将文件用作互斥锁(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, 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-mode
或 monitor-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;
}