2024年3月25日发(作者:)
什么是进程
初步知识:
进程是什么?下面是我从WIN32 API指南中节选的解释:
“一个进程是一个正在执行的应用程序,它包含有:私有的虚拟地址空间、代码、数据和其
它的操作系统资源,譬如进程可以存取的管道、文件和同步对象等等。”
从上面的定义中您可以看到,一个进程拥有几个对象:地址空间、执行模块和其它该执行程
序打开或创建的任何对象或资源。至少,一个进程必须包含可执行模块、私有的地址空间和
一个以上的线程。什么是线程呢?一个线程实际上是一个执行单元。当WINDOWS产生一个进
程时,它自动为该进程产生一个主线程。该线程通常从模块的第一条指令处开始执行。如果
进程需要更多的线程,它可以随后显式地产生。
当WINDWOS 接收到产生进程的消息时,它会为进程生成私有内存地址空间,接着把可执行
文件映射到该空间。在WIN32下为进程产生了主进程后,您还可以调用函数CreateProcess
来为您的进程产生更多的线程。
CreateProcess的原型如下:
CreateProcess proto lpApplicationName:DWORD,
lpCommandLine:DWORD,
lpProcessAttributes:DWORD,
lpThreadAttributes:DWORD,
bInheritHandles:DWORD,
dwCreationFlags:DWORD,
lpEnvironment:DWORD,
lpCurrentDirectory:DWORD,
lpStartupInfo:DWORD,
lpProcessInformation:DWORD
不要被这么多的参数吓倒,其实您可以忽略其中的大多数的参数(让怯腥笔≈担?
lpApplicationName --> 可执行文件的名称(含或不含路径)。如果该参数为NULL,那必
须在参数lpCommandLine中传递文件名称。
lpCommandLine --> 传递给欲执行的文件的命令行参数。如果lpApplicationName为NULL,
那必须在该参数中指定,譬如:" " 。
lpProcessAttributes 和 lpthreadAttributes --> 指定进程和主线程的安全属性。您可以
把它们都设成为NULL,这样就设置了缺省的安全属性。
bInheritHandles --> 标志位。用来设置新进程是否继承创建进程所有的打开句柄。
dwCreationFlags --> 有几个标志可以在此处设置以决定欲创建进程的行为,譬如:您可能
想创建进程后并不想让它立刻运行,这样在它真正运行前可以作一些检查和修改工作。您还
可以在此处设置新进程中的所有线程的优先级,通常我们把它设置为NORMAL_PRIORITY_CLA
SS。
lpEnvironment --> 指向环境块的指针,一般地环境块包含几个环境字符串。如果该参数为
NULL,那么新进程继承创建进程的环境块。
lpCurrentDirectory --> 指向当前目录以及为子进程设置的“当前目录”的路径。如果为
NULL, 则继承创建进程的“当前目录”路径。
lpStartupInfo --> 指向新进程的启动结构体STARTUPINFO的指针。STARTUPINFO告诉WIN
DOWS如何显示新进程的外观。该参数有许多的成员变量,如果您不想新进程有什么的特别
之处,可以调用GetStartupInfo函数来用创建进程的启动参数来填充STARTUPINFO结构体
变量。
lpProcessInformation --> 指向结构体PROCESS_INFORMATION的指针,该结构体变量包含
了一些标识该进程唯一性的一些成员变量:
PROCESS_INFORMATION STRUCT
hProcess HANDLE ? ; handle to the child process
hThread HANDLE ? ; handle to the primary thread of the child process
dwProcessId DWORD ? ; ID of the child process
dwThreadId DWORD ? ; ID of the primary thread of the child process
PROCESS_INFORMATION ENDS
进程句柄和进程ID是两个不同的概念。进程ID好似一个唯一值,而进程句柄是调用相关的
WINDOWS API 后得到的一个返回值。不能用进程句柄来标识一个进程的唯一性,因为这个值
并不唯一。在调用CreateProcess产生新进程后,该进程就被创建,而且CerateProcess
函数立即返回。您可以调用函数GetExitCodeProcess来检验进程是否结束。该函数的原型
如下:
GetExitCodeProcess proto hProcess:DWORD, lpExitCode:DWORD
如果调用成功,lpExitCode中包含了所查询进程的状态码。如果等于STILL_ACTIVE就表明
该进程依旧存在。 您可以调用函数TerminateProcess来强制终止一个进程。该函数的原型
如下:
TerminateProcess proto hProcess:DWORD, uExitCode:DWORD
您可以指定任意一个退出值。用该函数结束一个进程并不好,因为该进程加载的动态连接库
并不会得到进程正退出的消息。
例子:
在下面的例子中,当用户选择菜单项“crate process”时我们创建一个新进程。它会去执
行“"”。如果用户想要终止新进程,可以选择菜单项“terminate process”。
这时,应用程序检查欲终止的进程是否仍存在,若存在则调用TerminateProcess函数来终
止它。
.386
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
include
include
include
includelib
includelib


发布评论