进程的诞生与死亡
程序的运行必定会产生一个进程(process)
流程如下:<1>呼叫CreateProcess启动exe。
<2>系统产生“进程核心物件”,计数值为1;
<3>系统为进程分配地址空间。
<4>载入器将必要的码再入到上述位地址空间,包括exe的程序、资料以及DLLS。(需要的DLLS被记录在.idata section);
<5>系统为进程建立执行绪(primary thread),cpu为执行绪分配之行时间。
<6>系统呼叫 C runtime函数库的Startup code;
<7>Startup code 呼叫exe程序的WinMain函数。
<8>exe运行。
<9>使用者关闭exe,使WinMain中的讯息回路结束掉,WinMain结束。
<10>回到 Startup code。
<11>回到系统,系统呼叫ExitProcess结束进程。
进程创建函数CreateProcess();
进程自我结束可以调用ExitProces
结束别的进程调用 TerminateProcess();但是这种方法一般不安全,因为一般进程结束时,系统会通知进程所有开启的dlls都关闭,但是TerminateProcess结束一个进程系统却不会做这些事。最好的方法是
PROCESS_INFORMATION ProcInfo;
BOOL fSucess;
fSucess= CreateProcess(...,&ProcInfo);
if(fSucess){
CloseHandle(ProcInfo.hThread);
CloseHandle(ProcInfo.hProcess);
}
线程的创建和死亡:创建函数如下:
CreateThread();
_beginthreadex()
终结线程函数如下: TerminateThread()//该函数数不要使用,让线程自己善终最为妥当。
例子:
#include<afx.h>
#include <stdio.h>
#include <windows.h>
#include <process.h>
unsigned _stdcall myfunc(void *p);
void main()
{
HANDLE thd;
unsigned tid;
thd =(HANDLE) _beginthreadex(NULL,
0,
myfunc,
0,
0,
&tid);
WaitForSingleObject(thd,5000);
if (thd != NULL)
{
CloseHandle(thd);
}
}
unsigned _stdcall myfunc(void *p)
{
char str[50];
SYSTEMTIME st;
for (int i = 0; i < 10; i++)
{
GetSystemTime(&st);
sprintf(str, "%u:%u:%u", st.wHour, st.wMinute, st.wSecond);
printf("当前时间:%s \n", str);
Sleep(1000);
}
getchar();
getchar();
return NULL;
}
WaitForSingleObject(thd,5000);//等待线程结束。