Windows 进程及线程(三)
CreateProcess补充
如果lpApplicationName为NULL, 并且lpCommandLine只传递了一个没有.exe的字符串
它会自动加上 .exe 后缀
需要尤其注意STARTUPINFO结构体中, 各个参数的说明
终止进程
入口函数返回(main/WinMain函数)
这是最正确的方式, 只有这样才能保证主线程的所以资源都已经被正确的清理.
入口函数返回时, 会确保以下几件事请已经完成:
- 主线程所创建的任何对象都已经被正确的销毁
- 操作系统会正确的释放线程的堆栈
- 将进程的退出码设置为入库函数的返回值
- 递减内核对象的使用计数
进程中的一个线程调用ExitProcess
不应该调用此函数来结束进程
当函数呗调用的时候, 会强制结束进程
并将退出码设置为 uExitCode
但是此时线程并未正确结束, 会导致线程无法正确被清理.
VOID ExitProcess(UINT uExitCode);另一个进程中的线程调用TerminateProcess
不应该用此函数来结束进程
此函数能够结束其他进程
BOOL TerminateProcess(
HANDLE hProcess,
DWORD uExitCode
);进程中的所以线程都自然死亡
理论存在, 但是很少碰到这种情况.
使用计数
当我们使用CreateProcess启动一个新进程的时候
- 进程的使用计数变为1
- 在给PROCESS_INFORMATION进行赋值时, 进程的使用计数变为2
- 在进程的入口函数返回时, 使用计数减一
- 但是现在, 使用计数为1, 操作系统仍然不会进行回收
所以要使用
CloseHandle来进行使用计数减一, 否则会造成内核对象泄露如果不会使用HANDLE, 那么可以立即调用CloseHandle来减使用计数- 它并不是关闭这个HANDLE, 仅仅是对使用计数减一
- 它会让操作系统在合适的时候清理这个内核对象
未完待续...
如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-06-07 at 03:56 am