Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >操作系统实验一资料归纳

操作系统实验一资料归纳

作者头像
Ewdager
发布于 2020-07-14 06:16:42
发布于 2020-07-14 06:16:42
6200
举报
文章被收录于专栏:Gvoidy备份小站Gvoidy备份小站

句柄

指导书上出现了一个陌生的名词“句柄(handle)”,感觉比较奇妙,因为在之前编写微信公众号小程序看教程也编写了一个handle程序。所以留档一下吧。

句柄(handle),有多种意义,其中第一种是指程序设计,第二种是指Windows编程。现在大部分都是指程序设计/程序开发这类。 第一种解释:句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。 第二种解释:整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不在I/O文件中,它是毫无用处的。 句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,Windows大量使用了句柄来标识对象。

实验一中相关函数解释

参考MSDN 中的帮助文件 CreateMutex() 、 OpenMutex() 、 ReleaseMutex() 和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的。给出父子进程同步过程的一个大概描述。

  • CreateMutex() CreateMutex()函数可用来创建一个有名或无名的互斥量对象,其函数原型为HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针 BOOLbInitialOwner, // 初始化互斥对象的所有者 LPCTSTRlpName // 指向互斥对象名的指针 );
  • OpenMutex() OpenMutex函数为现有的一个已命名互斥体对象创建一个新句柄,函数原型:HANDLE OpenMutex( DWORD dwDesiredAccess, // access BOOL bInheritHandle, // inheritance option LPCTSTR lpName // object name );
  • ReleaseMutex() ReleaseMutex是一种线性指令,具有释放线程拥有的互斥体的控制权,函数原型为: BOOL WINAPI ReleaseMutex( HANDLE hMutex //hMutex:HANDLE,制定一个互斥体的句柄。 );
  • WaitForSingleObject() 当等待仍在挂起状态时,句柄被关闭,那么函数行为是未定义的。该句柄必须具有 SYNCHRONIZE 访问权限。函数原型: DWORD WINAPI WaitForSingleObject( __in HANDLE hHandle, __in DWORD dwMilliseconds );

参数说明:hHandle[in]对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。

dwMilliseconds[in]定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了。如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
互斥量Mutex的简单应用
互斥量是一个内核对象,它用来确保一个线程独占一个资源的访问。互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源。
全栈程序员站长
2022/09/13
4870
Windows编程(多线程)
CreateThread是一种微软在Windows API中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程。线程终止运行后,线程对象仍然在系统中,必须通过CloseHandle函数来关闭该线程对象。
全栈程序员站长
2022/07/13
1.2K0
CreateMutex WaitForSingleObject ReleaseMutex使用「建议收藏」
LPSECURITY_ATTRIBUTES lpMutexAttributes,//
全栈程序员站长
2022/09/13
2410
多线程-互斥变量
第一个 CreateMutex 函数功能:创建互斥量(注意与事件Event的创建函数对比) 函数原型: HANDLE  CreateMutex(   LPSECURITY_ATTRIBUTESlpMutexAttributes,   BOOLbInitialOwner,        LPCTSTRlpName ); 函数说明: 第一个参数表示安全控制,一般直接传入NULL。 第二个参数用来确定互斥量的初始拥有者。如果传入TRUE表示互斥量对象内部会记录创建它的线程的线程ID号并将递归计数设置为1,由于该线
用户1624346
2018/04/18
8650
CreateMutex、WaitForSingleObject、ReleaseMutex——创建互斥对象
CreateMutex CreateMutex作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。 互斥对象是系统内核维护的一种数据结构,它保证了对象对单个线程的访问权 互斥对象的结构:包含了一个使用数量,一个线程ID,一个计数器 使用数量是指有多少个线程在调用该对象,线程ID是指互斥对象维护的线程的ID 计数器表示当前线程调用该对象的次数 声明 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针 BOOLbInitialOwner, // 初始化互斥对象的所有者 LPCTSTRlpName // 指向互斥对象名的指针 ); 说明 创建一个互斥体(MUTEX) 返回值 Long,如执行成功,就返回互斥体对象的句柄;零表示出错。会设置GetLastError。即使返回的是一个有效句柄,但倘若指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS 参数表 参数 类型及说明lpMutexAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符 bInitialOwner Long,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有 lpName String,指定互斥体对象的名字。用vbNullString创建一个未命名的互斥体对象。如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符它的具体作用是每调用它一次将互斥对象的计数器减一,直到减到零为止,此时释放互斥对象,并将互斥对象中的线程id 置零。 它的使用条件是,互斥对象在哪个线程中被创建,就在哪个线程里面释放。因为调用的时候会检查当前线程的id是不是与互斥对象中保存的id一致,若一致,则此次操作有效,不一致,则无效。 注解编辑 一旦不再需要,注意必须用CloseHandle函数将互斥体句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象线程中止前,一定要调用ReleaseMutex释放互斥体,如不慎未采取这个措施,就会将这个互斥体标记为废弃(下一个释放的等待函数会返回WAIT_ABANDONED),并自动释放所有权。共享这个互斥体的其他应用程序也许仍 然能够用它,但会接收到一个废弃状态信息,指出上一个所有进程未能正常关闭。这种状况是否会造成影响取决于涉及到的具体应用程序。在Windows系统中,线程可以在等待函数中指定一个此线程已经拥有的互斥体,由于Windows的防死锁机制,这种做法不会阻止此线程的运行。 使用例子编辑 常用操作mutex的函数还有:ReleaseMutex/OpenMutex/WaitForSingleObject/WaitForMultipleObjects。 创建互斥体 h_mutex1=CreateMutex(NULL,FALSE,”mutex_for_readcount”);//创建一个互斥体 检查错误代码 #include <stdio.h> #include <windows.h> …… // main function HANDLE m_hMutex = CreateMutex(NULL, FALSE, “Sample07”);// 检查错误代码 if (GetLastError() == ERROR_ALREADY_EXISTS) { // 如果已有互斥量存在则释放句柄并复位互斥量 CloseHandle(m_hMutex); m_hMutex = NULL; // 程序退出 return FALSE; };//上面这段代码演示了有名互斥量在进程互斥中的用法。代码的核心是CreateMutex()对有名互斥量的创建。CreateMutex() 用于有独占要求的程序 (在其进程运行期间不允许其他使用此端口设备的程序运行,或不允许同名程序运行)。 详细例子 下面这段代码详细介绍了CreateMutex函数的使用方法: #include “stdafx.h”#include “windows.h”int main(int argc, char* argv[]){ HANDLE m_hMutex = CreateMutex(NULL,TRUE,”cplusplus_me”); DWORD dwRet = GetLastError(); if (m_hMutex) { if (ERROR_ALREADY_EXISTS == dwRe
全栈程序员站长
2022/09/13
9880
C++ 共享内存ShellCode跨进程传输
在计算机安全领域,ShellCode是一段用于利用系统漏洞或执行特定任务的机器码。为了增加攻击的难度,研究人员经常探索新的传递ShellCode的方式。本文介绍了一种使用共享内存的方法,通过该方法,两个本地进程可以相互传递ShellCode,从而实现一种巧妙的本地传输手段。如果你问我为何在本地了还得这样传,那我只能说在某些时候我们可能会将ShellCode打散,而作为客户端也不需要时时刻刻在本地存放ShellCode代码,这能保证客户端的安全性。
王 瑞
2023/12/07
3450
C++多线程编程:同步之互斥量Mutex「建议收藏」
C++使用内核对象互斥体(Mutex)来实现线程同步锁。当两个或更多线程需要同时访问一个共享资源时,Mutex可以只向一个线程授予对共享资源的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。
全栈程序员站长
2022/09/13
5350
操作系统实验三程序分析
从运行结果中能看到,生产的速度大于消费,生产者就要经常等待;生产速度小于消费,消费者就需要经常等待。步骤3中,线程的第一个执行函数是Producer,位于第三个参数。hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);
Ewdager
2020/07/14
7920
操作系统实验三程序分析
操作系统——线程
静态链接库是一个或多个obj文件的打包,所以有人干脆把obj文件生成lib文件的过程称为Archive,即合并在一起。比如你链接一个静态库,如果其中有错,他会准确的找到是哪个obj有错,即静态lib只是壳子。当我们的应用工程在使用静态库链接时,静态链接库要参与编译,在生成执行文件之前的链接过程中,将静态链接库的全部指令链接入可执行文件中,故而,在执行文件生成后,静态链接库.lib文件即可弃之不用。 动态链接库(dll)是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于.dll文件中,该dll包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。dll还有助于共享数据和资源。多个应用程序可同时访问内存中单个dll副本的内容。使用动态链接代替静态链接有若干优点。dll节省内存,减少交换操作,节省磁盘空间,更易于升级,提供售后支持,提供拓展MFC库类的机制,支持多语言程序。
海盗船长
2020/08/27
4450
createmutex函数参数含义_pthread_create函数
CreateMutex函数的作用是找出当前系统是否已经存在指定进程的实例,如果没有则创建一个互斥体。
全栈程序员站长
2022/11/10
5860
CreateThread用法详解[通俗易懂]
今天我给大家讲一讲C++中的多线程编程技术,C++本身并没有提供任何多线程机制,但是在windows下,我们可以调用SDK win32 api来编写多线程的程序,下面我就此简单的讲一下:
全栈程序员站长
2022/09/08
1.4K0
CreateMutex、WaitForSingleObject、ReleaseMutex「建议收藏」
互斥量(Mutex)和二元信号量类似,资源仅允许一个线程访问。与二元信号量不同的是,信号量在整个系统中可以被任意线程获取和释放,也就是说,同一个信号量可以由一个线程获取而由另一线程释放。而互斥量则要求哪个线程获取了该互斥量锁就由哪个线程释放,其它线程越俎代庖释放互斥量是无效的。
全栈程序员站长
2022/09/13
4900
C/C++ 实现多线程与线程同步
多线程中的线程同步可以使用,CreateThread,CreateMutex 互斥锁实现线程同步,通过临界区实现线程同步,Semaphore 基于信号实现线程同步,CreateEvent 事件对象的同步,以及线程函数传递单一参数与多个参数的实现方式。
王 瑞
2022/12/28
5270
C/C++ 实现多线程与线程同步
操作系统课设详细解答
(1)学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序)。 (2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解 Windows 进程的“一生”。 (3)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。
全栈程序员站长
2022/09/13
1.2K0
设计模式(7)——单例模式(Singleton Pattern,创建型)
使用设计模式可以提高代码的可复用性、可扩充性和可维护性。单例模式(Singleton Pattern),确保一个类只有一个实例,并提供一个全局访问点。
恋喵大鲤鱼
2018/08/03
8620
设计模式(7)——单例模式(Singleton Pattern,创建型)
9.2 运用API实现线程同步
Windows 线程同步是指多个线程一同访问共享资源时,为了避免资源的并发访问导致数据的不一致或程序崩溃等问题,需要对线程的访问进行协同和控制,以保证程序的正确性和稳定性。Windows提供了多种线程同步机制,以适应不同的并发编程场景。主要包括以下几种:
王 瑞
2023/10/02
3690
9.2 运用API实现线程同步
进程的同步、互斥、通信的区别,进程与线程同步的区别
这两天看进程的同步与通信,看了几本书上的介绍,也从网上搜了很多资料,越看越迷惑,被这几个问题搞得很纠结。
全栈程序员站长
2022/11/15
1.3K0
createmutex怎么用_create的用法和短语
LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针
全栈程序员站长
2022/11/10
3280
windows 多线程_关于多线程的技术分享
本文内容较为详细,关于更简短的一篇介绍,请看这里: https://blog.csdn.net/weixin_45525272/article/details/105057120
全栈程序员站长
2022/09/23
7560
n个进程访问一个临界资源,则设置的互斥信号量_多线程同步和互斥有几种实现方法
每个进程中访问临界资源的那段代码称为临界区(Critical Section)(临界 资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区, 进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程 必须互斥地对它进行访问。 多个进程中涉及到同一个临界资源的临界区称为相关临界区。
全栈程序员站长
2022/09/23
6850
相关推荐
互斥量Mutex的简单应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档