进程管理

进程管理(这里不涉及到进程间通讯)

主要函数:

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 以防止发生冲突。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值