进程是什么呢?可以简单理解为正在运行的程序。程序是静态的指令,进程是一个容器,包含了一系列运行在这个程序实例中的线程使用的资源。
一个进程包含一个或多个线程,线程是进程中执行代码的独立实体。


创建进程

接下来,创建一个打开命令行的小程序,运行该程序,打开命令行


再来一个小例子,还记得上一节中写的cmd创建文件的小工具吗?

我们将创建一个进程来来使用。
首先,我们从输入流读取用户的输入,用”ReadFile”就可以了。在VS2008下,可以通过F1查MSDN。


运行,得到:


注意,while循环中,有memset函数,如果我们将这行代码注释
//memset(&Command_str,0,MAX_PATH);

再次运行,会出现:

这是问什么呢?memset函数是用来做内存初始化,因为在分配内存空间的时候,内存的默认值不为0,因此,如果不做初始化,就会出现一些野值。


接下来,我们调用之前写的命令

#include ;

#include ;

#include ; // for strcmp

#include ; // for exit

void welcome();
void command_switch(char cmd_str);
BOOL CreateChildProcess(char
cmd_str);

int main()
{
char Command_str[MAX_PATH];
DWORD Command_len;
HANDLE hConsoleInput;

// 获取输出流的句柄
hConsoleInput = GetStdHandle(STD_INPUT_HANDLE);  

// 输出欢迎信息
welcome();

while(1)
{
    // 清空命令字符串
    ZeroMemory(&Command_str, MAX_PATH);
    // 输出提示符
    printf("tdcmd>;");
    // 读取输入流
    ReadFile(
        hConsoleInput,  // 文件句柄
        Command_str,    // 获取内容的缓冲字符数组
        MAX_PATH,       // 缓冲数组大小
        &Command_len,   // 实际读出的大小
        NULL);

    command_switch(Command_str);
}

}

void command_switch(char cmd_str)
{
//char cmd_tmp[MAX_PATH]={0};
char
pstr = cmd_str;

// 遍历到换行之前
while(*pstr != '\r' && *pstr != '\n')
{
     *pstr++;
}
//覆盖换行
*pstr = '\0';
// printf("收到命令:[%s]n", cmd_tmp);

// 判断命令
if( strcmp(cmd_str, "hi") == 0 )
{
    printf("你好~欢迎使用土豆儿的cmd工具\n");
} else if ( strcmp( cmd_str, "exit" ) == 0 )
{
    exit(0);
}else
{
    //创建子进程
    CreateChildProcess(cmd_str);
}

}
BOOL CreateChildProcess(char *cmd_str)
{
STARTUPINFO start_info = {sizeof(start_info)} ;
PROCESS_INFORMATION process_info;
BOOL flag;

 //将启动信息结构清零(相当于memset 0, 不过效率更高)
ZeroMemory(&start_info, sizeof(start_info));
//将进程信息结构清零
ZeroMemory(&process_info,sizeof(process_info));

flag = CreateProcess(
    NULL,                        //不传程序路径,使用命令行
    cmd_str,                    //命令行命令
    NULL,                        //不继承进程句柄(默认)
    NULL,                        //不继承线程句柄(默认)
    FALSE,                        //不继承句柄(默认)
    0,                                //没有创建标志(默认)
    NULL,                        //使用默认环境变量
    NULL,                        //使用父进程的目录
    &start_info,                //STARTUPINFO结构
    &process_info    );        //保存相关信息

if( !flag)
{
    //创建失败
    printf("Error:命令为找到(%d)\n",GetLastError());
    return 0;
}

//等待子进程结束
//使用到了通过PROCESS_INFORMATION结构体获取子进程的句柄hProcess
WaitForSingleObject(process_info.hProcess, INFINITE);
//关闭进程句柄和线程句柄
CloseHandle(process_info.hProcess);
CloseHandle(process_info.hThread);

return 1;

}

void welcome()
{
printf(“欢迎来到土豆儿的博客!\n”);

}

运行,得到:


终止进程

BOOL WINAPI TerminateProcess(
In HANDLE hProcess,
In UINT uExitCode
);

其中,对于”int argc, char const *argv[]”,”argc”表示输入的参数的个数,”argv”表示输入的参数,是一个数组,比如argv[0],表示输入的第一个参数。