C++windows内核编程笔记day13 进程、线程与信号量

简介: Windows进程 进程是一个容器,包含程序执行需要的代码、数据、资源等信息, windows进程的特点:每个进程都有自己的ID号每个进程都有自己的地址空间,进程之间无法访问对方的地址空间。

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;
}





相关文章
|
2月前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
8天前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
40 16
|
1月前
|
消息中间件 调度
如何区分进程、线程和协程?看这篇就够了!
本课程主要探讨操作系统中的进程、线程和协程的区别。进程是资源分配的基本单位,具有独立性和隔离性;线程是CPU调度的基本单位,轻量且共享资源,适合并发执行;协程更轻量,由程序自身调度,适合I/O密集型任务。通过学习这些概念,可以更好地理解和应用它们,以实现最优的性能和资源利用。
63 11
|
1月前
|
Java Linux 调度
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
39 6
|
2月前
|
消息中间件 Unix Linux
【C语言】进程和线程详解
在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
86 6
|
2月前
|
调度 开发者
深入理解:进程与线程的本质差异
在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
82 5
|
2月前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
2月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
82 4
|
3天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
1月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
68 19