您的位置:首页 > 其它

诞生与死亡(进程与线程的深入浅出)

2018-01-06 21:41 127 查看
进程的诞生与死亡

程序的运行必定会产生一个进程(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);//等待线程结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: