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 进程、线程与信号量的更多相关文章

  1. Windows核心编程笔记之进程

    改变进程基址,获取进程基址 #include <Windows.h> #include <iostream> #include <strsafe.h> #inclu ...

  2. c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理

    windows系统磁盘文件存储: 分区格式:NTFS / FAT32 GetSystemDirectory();//获取系统路径 GetWindowsDirectory();//获取windows路径 ...

  3. C++windows内核编程笔记day11 win32静态库和动态库的使用

    windows库程序: 静态库: 源码被链接到调用的程序或动态库,被调用时,代码最少有1份,文件后缀.LIB 动态库: 函数被程序或其它动态库调用,被调用时,代码仅仅有1份,文件后缀.DLL 静态库( ...

  4. C++windows内核编程笔记day09_day10,对话框和窗体基本控件等的使用

    //设置字体颜色 SetTextColor(hdc,RGB(255,0,0)); //窗体背景 //wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); //wce. ...

  5. storysnail的Windows串口编程笔记

    storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...

  6. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  7. Linux内核学习笔记二——进程

    Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...

  8. Windows核心编程笔记之内核对象

    0x01 子进程继承父进程内核对象句柄 父进程 #include <Windows.h> #include <iostream> #include <strsafe.h& ...

  9. 《Windows内核编程》---系统线程和同步事件

    系统线程: 在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是: NTSTATUS PsCreateSystemThread( OUT PHANDLE T ...

随机推荐

  1. Android 所遇问题(一)

    1.打开Eclipse更新了一下sdk和adt到22.6,更新一切都很顺利,可以新建一个工程时发现多了一个appcompat_v7的内容.查看项目发现本来MainActivity是继承Activity ...

  2. Loadrunner 怎么将response的数据下载下来

    我们请求url时候会遇见返回的数据格式为json格式.但是怎么显示到reply页面呢?其实有一个参数需要设置成0 web_url("GetRequestData", "U ...

  3. oracel become INDEX UNUSABLE

    1. IMPORT PARTITION or conventional path SQL*Loader. 2. Direct-path SQL*Loader leaves affected local ...

  4. 【协议篇】UDP

    UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议.它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! UDP适用于一次只传送少量数据.对可靠性要 ...

  5. MVC3循环添加数据

    foreach (var item in orderdetails) { var billdetails = new BillDetail(){BillCode = billoflading.Bill ...

  6. 2、classpath、path、JAVA_HOME的作用

    windows xp下配置JDK环境变量: 1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为D:\java\jdk1.5.0_08: 2.安装完成后,右击“我的电脑”,点击“ ...

  7. Oracle的PLSQL别名中文出现乱码解决方法

     乱码之乱,乱在心里.行而上,眼迷茫! 01.查询oracle服务端默认语言 select * from nls_database_parameters NLS_LANGUAGE AMERICAN   ...

  8. Android蓝牙A2DP连接实现

    代码地址如下:http://www.demodashi.com/demo/14624.html 开发环境: 开发工具:Androidstudio 适配机型:honor8(Android6.0), 坚果 ...

  9. Eclipse集成ijkplayer并实现本地和网络视频播放等

    概述 Eclipse 集成ijkplayer demo,播放本地视频.和rtmp流. 详细 代码下载:http://www.demodashi.com/demo/10630.html 原文地址:Ecl ...

  10. 客户端用java api 远程操作HDFS以及远程提交MR任务(源码和异常处理)

    两个类,一个HDFS文件操作类,一个是wordcount 词数统计类,都是从网上看来的.上代码: package mapreduce; import java.io.IOException; impo ...