C++windows内核编程笔记day13 进程、线程与信号量
Windows进程
进程是一个容器,包括程序运行须要的代码、数据、资源等信息,
windows进程的特点:
每一个进程都有自己的ID号
每一个进程都有自己的地址空间。进程之间无法訪问对方的地址空间。
每一个进程都有自己的安全属性
每一个进程至少包括一个线程。
获取和释放环境信息
GetEnvironmentStrings
FreeEnvironmentStrings
获取或设置 本程序的环境变量
GetEnvironmentVariable
SetEnvironmentVariable
演示样例:
char* env=(char*) GetEnvironmentStrings();
char* env2=env;
while(env2[0])
{
printf("%s\n",env2);
env2=env2+strlen(env2)+1;
}
FreeEnvironmentStrings(env);
SetEnvironmentVariable("abc","100");
char buf[10]={0};
GetEnvironmentVariable("abc",buf,256);
printf("%s\n",buf);
进程信息
1、进程ID
DWORD pid= GetCurrentProcessId();
2、进程句柄
HANDLE hpro=GetCurrentProcess();
3、启动进程
BOOL CreateProcess(
LPCTSTR lpApplicationName,//应用程序名称
LPTSTR lpCommandLine,//命令行參数
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles,//是否能被子进程使用
DWORD dwCreationFlags,//创建方式
LPVOID lpEnvironment,//环境信息
LPCTSTR lpCurrentDirectory,//当前文件夹
LPSTARTUPINFO lpStartupInfo,//返回的:起始信息
LPPROCESS_INFORMATION lpProcessInformation //返回的:进程信息
);
演示样例:
STARTUPINFO stinfo={0};
PROCESS_INFORMATION pi={0};
CreateProcess("C:/Windows/System32/calc.exe",0,NULL,NULL,TRUE,0,NULL,NULL,
&stinfo,&pi);
WaitForSingleObject(pi.hProcess,INFINITE);//等待信号(通常是进程结束才有信号)
printf("Processid=%d,handle=%d\n",pi.dwProcessId,pi.hProcess);
退出本进程
VOID ExitProcess( UINT uExitCode//退出码
);
退出随意进程
BOOL TerminateProcess( HANDLE hProcess, // handle to the process
UINT uExitCode // exit code for the process
);
通过进程ID获取进程句柄
HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle,// handle inheritance option
DWORD dwProcessId// process identifier
);
获取和关闭进程演示样例(进程ID为32):
HANDLE calc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,32);
TerminateProcess(calc,-1);
进程间的等候,等候 进程/线程 信号到来
(通常是进程结束才有信号)
DWORD WaitForSingleObject(
HANDLE hHandle, // handle to object
DWORD dwMilliseconds // time-out interval
);
windows线程
windows线程是能够运行的代码实例。系统是以线程为单位调度程序。
windows线程特点:
线程都有Id
线程具有自己的安全属性
线程有什么的内存栈
线程都有自己的寄存器信息
进程多任务:每一个进程都使用私有的地址空间。
线程多任务:进程内多个线程使用同一个地址空间。
线程处理函数:
DWORD WINAPI ThreadProc(
LPVOID lpParameter // thread data
);
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,// SD
SIZE_T dwStackSize, // 线程栈大小(默认1M)
LPTHREAD_START_ROUTINE lpStartAddress, // 线程处理函数
LPVOID lpParameter, //传给线程处理函数的參数
DWORD dwCreationFlags, // creation option
LPDWORD lpThreadId //返回值:线程ID
);
dwCreationFlags:
0-创建之后马上运行
CREATE_SUSPENDED-创建之后挂起。不马上运行
//结束线程,与结束进程使用方法一样
TerminateThread(...)
ExitThread(...);
CloseHandle()//关闭线程句柄,不是结束线程
可用WaitForSingleObject()等候线程结束
挂起线程
DWORD SuspendThread( HANDLE hThread // handle to thread);
恢复线程
DWORD ResumeThread( HANDLE hThread // handle to thread);
演示样例:
DWORD CALLBACK TestProc1(LPVOID param)
{
char*txt=(char*)param;
while(1)
{
printf("%s\n",txt);
Sleep(1000);
}
}
DWORD CALLBACK TestProc2(LPVOID param)
{
char*txt=(char*)param;
while(1)
{
printf("%s\n",txt);
Sleep(1000);
}
}
void Thread()
{
DWORD tid=0;
char *txt="*************************";
HANDLE hthread1=CreateThread(NULL,0,TestProc1,txt,
0,&tid);
char *txt2="————————————";
HANDLE hthread2=CreateThread(NULL,0,TestProc2,txt2,
CREATE_SUSPENDED,&tid);
getchar();
SuspendThread(hthread1);//挂起
ResumeThread(hthread2);//恢复
}
获取线程ID和句柄,与进程操作类似:
GetCurrentThreadId
GetCurrentThread
OpenThread
进程演示样例代码:
- // WinEnv.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include<STDIO.H>
- #include<WINDOWS.H>
- void winProc()
- {
- char* env=(char*) GetEnvironmentStrings();
- char* env2=env;
- while(env2[0])
- {
- printf("%s\n",env2);
- env2=env2+strlen(env2)+1;
- }
- FreeEnvironmentStrings(env);
- SetEnvironmentVariable("abc","100");
- char buf[10]={0};
- GetEnvironmentVariable("abc",buf,256);
- printf("%s\n",buf);
- DWORD pid= GetCurrentProcessId();
- HANDLE hpro=GetCurrentProcess();
- }
- void CreateProc()
- {
- STARTUPINFO stinfo={0};
- PROCESS_INFORMATION pi={0};
- CreateProcess("C:/Windows/System32/calc.exe",0,NULL,NULL,TRUE,0,NULL,NULL,
- &stinfo,&pi);
- WaitForSingleObject(pi.hProcess,INFINITE);//等待信号(通常是进程结束才有信号)
- printf("Processid=%d,handle=%d\n",pi.dwProcessId,pi.hProcess);
- }
- void KillProc()
- {
- HANDLE calc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,32);
- TerminateProcess(calc,-1);
- }
- int main(int argc, char* argv[])
- {
- //winProc();
- CreateProc();
- //KillProc();
- return 0;
- }
线程与信号量使用演示样例(信号量是一种线程同步技术):
- // winThread.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include<stdio.h>
- #include<windows.h>
- char g_txt[256];
- char g_txt2[256];
- CRITICAL_SECTION cs={0};
- HANDLE g_hSem=0;
- DWORD CALLBACK PrintProc(LPVOID param)
- {
- char buf[10]={0};
- while(1)
- {
- WaitForSingleObject(g_hSem,INFINITE);//有信号才运行
- ZeroMemory(buf,sizeof(buf));
- GetEnvironmentVariable("exit",buf,sizeof(buf));
- if(strcmp(buf,"1")==0) break;
- printf("**************************\n");
- }
- return 0;
- }
- /*
- DWORD CALLBACK CtrlProc(LPVOID param)
- {
- int i=0;
- while(1)
- {
- SetEvent(g_hevent);//发一个信号
- Sleep(1000);
- i++;
- if(i==1000) break;
- }
- return 0;
- }
- */
- void Thread()
- {
- DWORD tid=0;
- char *txt="**************************";
- HANDLE hthread1=CreateThread(NULL,0,PrintProc,txt,
- 0,&tid);
- /*
- //char *txt2="—————————————";
- //HANDLE hthread2=CreateThread(NULL,0,CtrlProc,txt2,
- // 0,&tid);
- //HANDLE ht[2]={0};
- //ht[0]=hthread1;
- //ht[1]=hthread2;
- //WaitForMultipleObjects(2,ht,TRUE,INFINITE);
- */
- SetEnvironmentVariable("exit","0");
- while(1)
- {
- char c=getchar();
- if(c=='\0'||c=='\n') continue;
- int count=c-'0';
- printf("count1=%d \n",count);
- if(count>=0&& count<=9)
- {
- printf("count2=%d \n",count);
- ReleaseSemaphore(g_hSem,count,NULL);//又一次设置成5次
- }
- else if(c=='e'|| c=='E')
- {
- SetEnvironmentVariable("exit","1");
- ReleaseSemaphore(g_hSem,1,NULL);//又一次设置成5次
- break;
- }
- }
- WaitForSingleObject(hthread1,INFINITE);
- printf("wait over!\n");
- CloseHandle(hthread1);
- //CloseHandle(hthread2);
- }
- int main(int argc, char* argv[])
- {
- g_hSem=CreateSemaphore(NULL,3,10,"s1");
- Thread();
- CloseHandle(g_hSem);
- return 0;
- }
C++windows内核编程笔记day13 进程、线程与信号量的更多相关文章
- Windows核心编程笔记之进程
改变进程基址,获取进程基址 #include <Windows.h> #include <iostream> #include <strsafe.h> #inclu ...
- c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理
windows系统磁盘文件存储: 分区格式:NTFS / FAT32 GetSystemDirectory();//获取系统路径 GetWindowsDirectory();//获取windows路径 ...
- C++windows内核编程笔记day11 win32静态库和动态库的使用
windows库程序: 静态库: 源码被链接到调用的程序或动态库,被调用时,代码最少有1份,文件后缀.LIB 动态库: 函数被程序或其它动态库调用,被调用时,代码仅仅有1份,文件后缀.DLL 静态库( ...
- C++windows内核编程笔记day09_day10,对话框和窗体基本控件等的使用
//设置字体颜色 SetTextColor(hdc,RGB(255,0,0)); //窗体背景 //wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); //wce. ...
- storysnail的Windows串口编程笔记
storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- Windows核心编程笔记之内核对象
0x01 子进程继承父进程内核对象句柄 父进程 #include <Windows.h> #include <iostream> #include <strsafe.h& ...
- 《Windows内核编程》---系统线程和同步事件
系统线程: 在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是: NTSTATUS PsCreateSystemThread( OUT PHANDLE T ...
随机推荐
- 在 linux 下使用 CMake 构建应用程序
学习cmake http://xwz.me/wiki/doku.php?id=cmake 碰到的一些问题: 1.You have changed variables that require your ...
- wepy - 与原生有什么不同(watcher监听器.)
<style> </style> <template> <view>监听值:{{num}}</view> </template> ...
- php之表单-2(表单验证)
PHP 表单验证 本章节我们将介绍如何使用PHP验证客户端提交的表单数据. PHP 表单验证 在处理PHP表单时我们需要考虑安全性. 本章节我们将展示PHP表单数据安全处理,为了防止黑客及垃圾信息我们 ...
- pushlet单播与多播
近期要弄一个消息推送的功能,在网上找了非常多的关于pushlet的文章,尽管写的都非常具体,可是本人看了以后却总认为是模棱两可···不知道怎样下手,终于參考了这些文章中的一些内容,并结合官网的源码.做 ...
- Spring Web MVC 原理学习(下)
接着上一篇博客,这一篇.我们依据一个简单的demo,来对SpringMVC的原理再次学习: 一.配置web.xml 我们新建一个web项目.在 ...
- Java 基础【11】.class getClass () forName() 详解
类名.class是Class对象的句柄,每个被加载的类,在jvm中都会有一个Class对象与之相对应. 如果要创建新的对象,直接使用Class对象的局部class.forName就可以了,不需要用ne ...
- MySQL中分组取第一条, 以及删除多余的重复记录
检查重复记录 -- 检查重复code1 select count(identity) num, identity from event_log where code='code1' order by ...
- 微信小程序的零食商城
概述 这是一个微信小程序的商城应用,功能包括了首页.分类.购物车.个人中心.商品列表.商品详情.订单.地址管理等 详细 代码下载:http://www.demodashi.com/demo/10353 ...
- [转载]windows7中没用boot.ini文件而是改用BCDEDIT来配置了
原文地址:windows7中没用boot.ini文件而是改用BCDEDIT来配置了作者:开心骝哥 本人安装的Win7,因为机上有两个系统,一个dos系统,一个win7系统,开机时总是会在系统选择的界面 ...
- Ubuntu14.04 mount远程服务器上的目录
备忘用. 一,远程服务器设置: 1,在/etc/exports中添加如下配置: /home/xxx *(insecure,rw,sync,no_root_squash,anonuid=123,anon ...