进程管理(这里不涉及到进程间通讯)
主要函数:
CreateProcess。
直接来看刚才写的一段程序。
2个进程,(主)进程创建5个子进程并给他传递打开文件的句柄,让5个子进程分配对文件进行写数据。
子进程:
#include<windows.h>
#include<tchar.h>
#include<iostream>
using namespace std;
int _tmain(DWORD argc,LPTSTR argv[])
{
if(argc!=3)
{
cout<<"The arg is not right"<<endl;
return 1;
}
DWORD dwPosition=(DWORD)_ttoi(argv[2]);
HANDLE hFile=(HANDLE)((DWORD)_ttol(argv[1]));
TCHAR *lpBuffer=TEXT("this is the child process/n");
DWORD dwCount;
OVERLAPPED ov;
ov.hEvent=NULL;
ov.Internal=0;
ov.InternalHigh=0;
ov.Offset=0;
ov.OffsetHigh=0;
ov.Pointer=0;
ov.Offset=dwPosition;
LockFile(hFile,dwPosition,0,_tcslen(lpBuffer)*sizeof(TCHAR)+4,0);
SetFilePointer(hFile,dwPosition,NULL,FILE_BEGIN);
if(!WriteFile(hFile,lpBuffer,_tcslen(lpBuffer)*sizeof(TCHAR),&dwCount,NULL))
{
cout<<"failed to writefile"<<endl;
return 1;
}
UnlockFileEx(hFile,0,sizeof(lpBuffer)*sizeof(TCHAR)+4,0,&ov);
return 0;
}
父进程:
#include <windows.h>
#include<tchar.h>
#include<iostream>
#include<string>
using namespace std;
int main()
{
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle=true;
sa.lpSecurityDescriptor=NULL;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
STARTUPINFO startUpInfo;
PROCESS_INFORMATION processInfo;
HANDLE phChildProcess[5];
HANDLE hFile=CreateFile(TEXT("d://1.txt"),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
&sa,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,
NULL);
if(INVALID_HANDLE_VALUE==hFile)
{
cout<<"failed to create file"<<endl;
return 1;
}
for(int i=0;i!=5;++i)
{
TCHAR* wszCmdLine=(TCHAR*)calloc(50,sizeof(TCHAR));
_stprintf(wszCmdLine,TEXT(" %d %d/0"),hFile,i*100);
wcout<<wszCmdLine<<endl;
cout<<hFile<<endl;
GetStartupInfo(&startUpInfo);
if(!CreateProcess(TEXT("process_op.exe"),wszCmdLine,
NULL,NULL,TRUE,0,NULL,NULL,&startUpInfo,&processInfo))
{
cout<<"failed to create process :"<<i+1<<endl;
continue;
}
phChildProcess[i]=processInfo.hProcess;
CloseHandle(processInfo.hThread);
free(wszCmdLine);
}
WaitForMultipleObjects(5,phChildProcess,TRUE,INFINITE);
TCHAR lpBuffer[1024];
DWORD count;
SetFilePointer(hFile,0,NULL,FILE_BEGIN);
if(ReadFile(hFile,lpBuffer,1024*sizeof(TCHAR),&count,NULL))
{
wcout<<lpBuffer<<endl;
CloseHandle(hFile);
system("pause");
return 0;
}
system("pause");
return 0;
}
注意因为在父进程中把文件句柄传给子进程,所以需要该文件可以继承,所以需要设置安全属性SECURITY_ATTRIBUTES,而且在CreateProcess中也需要设置第5个参数为TRUE,以表明子进程可以继承父进程的句柄。另外注意TEXT("process_op.exe")是子进程的路径
然后通过 WaitForMultipleObjects 等待子进程都运行完毕就可以了,
注意在子进程中要设置文件锁: LockFile, UnlockFileEx 以防止发生冲突。