170209

来源:互联网 发布:网络大电影计划书 编辑:程序博客网 时间:2024/06/06 00:59

1625-5    王子昂    总结《2017年2月9日》  【连续第132天总结】

A.windows核心编程

B.一个线程调用CreateProcess时,系统将创建一个进程内核对象,其初始使用计数为1。进程内核对象不是进程本身,而是操作系统用来管理这个进程的一个小型数据结构。然后系统为新进程创建一个虚拟地址空间,并将可执行文件和所有的DLL代码及数据加载到进程的地址空间。

接着,新进程的主线程创建一个线程内核对象。这个主线程一开始就会执行C/C++运行时的启动例程,它是由连接器设为应用程序入口的,最终会调用应用程序WinMain,wWinMain,main或wmain函数。

如果系统成功创建了新进程和主线程CreateProcess将返回True

但是,CreateProcess在进程完全初始化好之前就会返回True。也就是说,如果在初始化中遇到错误,比如说找不到某个DLL文件,那么进程会终止。但是父进程却得不到任何异常信息。

进程可以通过4种方式终止

入口点函数返回

调用ExitProcess函数

另一个进程中的线程调用TerminateProcess函数

所有进程都“自然死亡”

其中,第一种方式是正确的,或者说是最好的;最后一种方式基本上不会发生;其他两种是不推荐使用的方式

当入口点函数返回时,可以保证:所有C++对象都使用了析构函数;系统将正确释放线程栈所使用的内存;系统将进程的退出代码设为入口点函数的返回值;系统减少了进程内核对象的使用计数

ExitProcess函数不会返回值,显式调用其之后的指令也不会再执行。因此有导致清理工作不正常的可能。

TerminateProcess函数可以被任何线程调用,来结束任何一个(包括自己)的进程。只有在无法通过其他方法来强制进程退出时才应使用此函数。被终止的进程不会收到任何通知,也不会进行清理工作。但是进程终止以后,系统会进行彻底清理,保证没有内存资源泄露。释放所有内存,关闭所有打开的文件,递减所有内核对象的使用计数,销毁所有对象。

进程在终止后绝对不会泄露任何东西。

一个进程终止时,系统会依次执行

终止进程的所有线程

释放进城费分配的所有用户对象的GDI对象,关闭所有内核对象。

进程的退出代码从STILL_ACTIVE变为传给ExitProcess或TerminateProcess函数的代码

进程内核对象的状态变成已触发状态。

进程内核对象的使用计数减1

当父进程忘记关闭它的一个子进程的句柄时,往往会使进程内核对象的使用计数没有清零而继续保持着。这是windows的一个特性。

GetExitCodeProcess函数可以获得已经终止的进程的退出代码,通过未关闭的进程内核对象。当我们不需要的时候,可以通过CloseHandle来显式清除进程内核对象。

 

昨天进行的TCP外网连接出现了问题,因此家里的网络是使用路由器连接的,因此在架设服务器时,多台终端共享一个外网ip导致客户端无法从外网连接进入。解决方法是进行路由器端口映射,把内网终端的某一段端口映射到路由器上,这样就可以在小型局域网中架设服务器。然而在路由器上设置以后仍然不行。查询发现因为家中使用的是移动网络,而它使用了NAT技术,也就是在外层又架设了一个局域网来节省ip使用。这样的话,外层局域网共享一个ip,并且路由器设置掌握在运营商手中,虽然可以节省ip,但不可能架设服务器了。不过还有一个办法:虚拟局域网(VLAN)。不过要专门安装软件,就没有必要了。回学校直连ip再试吧。


C. 明日计划

windows核心编程

python网络编程


0 0
原创粉丝点击