问题描述
所以我的任务是这样的:
- 第一个过程将创建或打开文件“ log.txt”,该文件位于程序所在的目录中。然后将用户输入添加到该文件。
- 第二个进程是此文件的“监视器”。它检查文件是否存在,显示文件的大小,并显示自第二个进程启动以来如何输入manny字符。
请注意,我知道程序本身是一个过程,但需要这样做。有一些“技巧”可以将文件用作互斥体(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-mode
或argv[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;
}