进程相关

来源:互联网 发布:电商美工设计 编辑:程序博客网 时间:2024/05/01 08:42
1、当不再使用进程对象与线程对象时,要记得关闭进程或线程的句柄。
2、GetCurrentProcessId得到当前进程ID,GetCurrentThreadId得到当前正在运行线程的ID,
    GetProcessId获得与指定句柄对应的一个进程ID,GetThreadId获得与指定句柄对应的线程ID,GetProcessIdOfThread获得线程所有进程的ID。
3、要保证一个进程或线程ID不被重用,唯一的办法就是保证进程或线程对象不被销毁。一般当应用程序不再使用ID的时候,使用CloseHandle来释放内核对象。
4、终止进程4种方式:主线程入口点函数返回(推荐的方式)、进程中的一个线程调用ExitProcess(要避免这种方式)、
    另一个进程的线程调用TerminateProcess函数(要避免这种方式)、进程中的所有线程都“自然死亡”(不会发生的方式)。
5、主线程的入口点函数返回,可以保证以下操作会执行:
    1)、该线程创建的任何C++对象都将由这些对象的析构函数正确销毁。
    2)、操作系统将正确释放线程栈使用的内存。
    3)、系统将进程的退出代码设为入口点函数的返回值。
    4)、系统递减进程内核对象的使用计数。
6、应用程序的主线程从入口点返回时,C/C++运行库就会调用ExitProcess来终止进程。这解释了为什么只需从主线程的入口函数返回,就会终止整个进程。
7、C/C++应用程序应该避免调用ExitProcess,这样会造成有些析构函数不会执行,可能会造成泄漏内存或其它资源。
8、任何线程都可以调用TerminateProcess终止另一个进程或它自己的进程,执行该函数后,操作系统会进行彻底的清理工作,所以不会泄漏任何东西。
9、TerminateProcess是异步的,它告诉系统我们希望进程终止,但到函数返回的时候,系统并不能保证进程已经强行终止了。
10、当系统检测到一个进程中没有任何线程在运行时,就会终止这个进程。
11、进程终止时,系统会依次执行以下操作:
    1)、终止进程中遗留的任何线程。
    2)、释放进程分配的所有用户对象和GDI对象,关闭所有内核对象(不包括被其它进程打开的)。
    3)、进程的退出代码从STILL_ACTIVE变为传给ExitProcess或TerminateProcess函数的代码。
    4)、进程内核对象变为已解发状态。
    5)、进程内核对象使用计数减1。
12、不同进程之间传递数据的几种方式:动态数据交换(DDE)、OLE、管道、邮件槽等。
13、运行独立的子进程:
    PROCESS_INFORMATION pi;
    BOOL fSuccess=CreateProcess(...,&pi);
    if(fSuccess)
    {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }

原创粉丝点击