文件句柄

node child_process模块

跟風遠走 提交于 2020-01-02 21:00:06
NodeJs是一个单进程的语言,不能像Java那样可以创建多线程来并发执行。当然在大部分情况下,NodeJs是不需要并发执行的,因为它是事件驱动性永不阻塞。但单进程也有个问题就是不能充分利用CPU的多核机制,根据前人的经验,可以通过创建多个进程来充分利用CPU多核,并且Node通过了child_process模块来创建完成多进程的操作。 child_process模块给予node任意创建子进程的能力,node官方文档对于child_proces模块给出了四种方法,映射到操作系统其实都是创建子进程。但对于开发者而已,这几种方法的api有点不同 child_process.exec(command[, options][, callback]) 启动 子进程来执行shell命令,可以通过回调参数来获取脚本shell执行结果 const { exec } = require('child_process'); exec('cat *.js bad_file | wc -l', (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`); return; } console.log(`stdout: ${stdout}`); console.log(`stderr: ${stderr}`);

全局键盘钩子

这一生的挚爱 提交于 2019-12-31 23:15:57
这是在系统的范围内截获键盘消息,所以需要全局键盘钩子,全局键盘钩子需要DLL文件的支持,这样系统才能把DLL强行的加载到进程中去。 建立一个新的DLL文件 ,在DllMain()函数所在的CPP中添加: 定义两个全局变量:钩子句柄和DLL模块句柄。 HHOOK g_Hook = NULL; HINSTANCE g_Instance = NULL; 在DllMain函数中保存DLL模块句柄,安装钩子SetWindowsHookEx()参数需要用到。 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call,LPVOID lpReserved) { g_Instance = (HINSTANCE)hModule; //保存DLL模块句柄 return TRUE; } 键盘钩子函数,调用约定为_stdcall: LRESULT _stdcall KeyboradProc(int code ,WPARAM wParam,LPARAM lParam) { if (code < 0) { return CallNextHookEx(g_Hook,code,wParam,lParam); } if (code == HC_ACTION&&lParam>0) { char Buffer[10] = { 0 };

ShellExecute函数介绍

喜欢而已 提交于 2019-12-26 23:45:00
功能:ShellExecute的功能是运行一个外部程序 头文件:#include <shellapi.h> 函数原型: ShellExecute(HWND hWnd,LPCSTR lpOperation,LPCSTR lpFileName,LPCSTR lpParameters, LPCSTR lpDirectory,int nShowCmd)    HWND hWnd: {用于指定父窗体句柄。当函数调用过程出现错误时,它将作为Windows消息窗体的父窗体。比如,能够将其设置为应用程序主窗体句柄,即 Application.Handle,也能够将其设置为桌面窗体句柄(用GetDesktopWindow函数获得}    LPCSTR lpOperation: 用于指定要进行的操作: open、print、edit、explore、find “open”操作表示运行由FileName參数指定的程序,或打开由FileName參数指定的文件或目录; “print”操作表示打印由FileName參数指定的文件; “explore”操作表示浏览由FileName參数指定的目录。 edit  编辑; find  搜寻; 当參数设为nil时,表示运行默认操作“open”;    LPCSTR lpFileName: 用于指定要打开的文件名称、要运行的程序文件名称或要浏览的目录名。   

记一次传递文件句柄引发的血案

匆匆过客 提交于 2019-12-26 17:55:06
apue 上讲 Solaris 系统是可以在进程间通过 STREAMS 管道传递文件句柄的。 书上讲道:“在技术上,发送进程实际上向接收进程传送一个指向一打开文件表项的指针,该指针被分配存放在接收进程的第一个可用描述符项中。” 个人非常感兴趣,就写下了下面的两个程序来验证 STREAMS 管道是否支持发送接收文件描述符,且发送方与接收方的描述符是否可能不相同。 spipe_server.c 1 #define MAXLINE 128 2 3 int get_temp_fd () 4 { 5 char fname[128] = "/tmp/outXXXXXX"; 6 int fd = mkstemp (fname); 7 printf ("create temp file %s with fd %d\n", fname, fd); 8 return fd; 9 } 10 11 int main (int argc, char *argv[]) 12 { 13 if (argc < 2) { 14 printf ("usage: spipe_server <spipe_client>\n"); 15 return 0; 16 } 17 18 int n; 19 int fd[2], fd_to_send, fd_to_recv; 20 if (pipe (fd) < 0) { 21

Windows GDI

与世无争的帅哥 提交于 2019-12-21 05:05:55
TextOut (hdc, x, y, psText, iLength) ; TextOut向窗口的显示区域写入字符串。psText参数是指向字符串的指针,iLength是字符串的长度。x和y参数定义了字符串在显示区域的开始位置。hdc参数是「设备内容句柄」,它是GDI的重要部分。实际上,每个GDI函数都需要将这个句柄作为函数的第一个参数。 设备内容 读者可能还记得,句柄只不过是一个数值,Windows以它在内部使用对象。程序写作者从Windows取得句柄,然后在其它函数中使用该句柄。设备内容句柄是GDI函数的窗口「通行证」,有了这种设备内容句柄,程序写作者就能自如地在显示区域上绘图,使图形如自己所愿地变得好看或者难看。 设备内容(简称为「DC」)实际上是GDI内部保存的数据结构。设备内容与特定的显示设备(如视讯显示器或打印机)相关。 对于视讯显示器,设备内容总是与显示器上的特定窗口相关。 设备内容中的有些值是图形「属性」,这些属性定义了GDI绘图函数工作的细节。例如,对于TextOut,设备内容的属性确定了文字的颜色、文字的背景色、x坐标和y坐标映像到窗口的显示区域的方式,以及显示文字时Windows使用的字体。 当程序需要绘图时,它必须先取得设备内容句柄。在取得了该句柄后,Windows用内定的属性值填入内部设备内容结构。 当程序在显示区域绘图完毕后,它必须释放设备内容句柄

JVM内存模型和面试题解析

我怕爱的太早我们不能终老 提交于 2019-12-21 04:10:55
一、JVM运行时区域      其中,      线程私有的:程序计数器,虚拟机栈,本地方法栈      线程共享的:堆,方法区,直接内存 1 程序计数器   程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完。   java虚拟机的多线程是通过线程轮流切换并分配CPU的时间片的方式实现的,因此在任何时刻一个处理器(如果是多核处理器,则只是一个核)都只会处理一个线程,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,因此这类内存区域为“线程私有”的内存。   从上面的介绍中我们知道程序计数器主要有两个作用: 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。   注意: 程序计数器是唯不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。 2 Java 虚拟机栈   Java虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是

CreateIoCompletionPort

好久不见. 提交于 2019-12-20 19:46:22
创建输入/输出(I / O)完成端口并将其与指定的文件句柄相关联,或创建尚未与文件句柄相关联的I / O完成端口,从而允许以后进行关联。 将打开的文件句柄的实例与I / O完成端口相关联,可使进程接收有关该文件句柄的异步I / O操作完成的通知。 注意 此处使用的术语文件句柄是指表示重叠的I / O端点的系统抽象,而不仅仅是磁盘上的文件。任何支持重叠I / O的系统对象(例如网络端点,TCP套接字,命名管道和邮件插槽)都可以用作文件句柄。有关更多信息,请参见“备注”部分。 句法 C ++ HANDLE WINAPI CreateIoCompletionPort( _In_ HANDLE FileHandle, _In_opt_ HANDLE ExistingCompletionPort, _In_ ULONG_PTR CompletionKey, _In_ DWORD NumberOfConcurrentThreads ); 参量 FileHandle [输入] 打开的文件句柄或INVALID_HANDLE_VALUE。 该句柄必须指向支持重叠I / O的对象。 如果提供了句柄,则必须打开它才能完成I / O重叠。例如,在使用CreateFile函数获取句柄时,必须指定FILE_FLAG_OVERLAPPED标志。 如果指定了INVALID_HANDLE_VALUE

Java内存区域

十年热恋 提交于 2019-12-17 20:39:35
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 基本问题: 介绍下Java内存区域(运行时数据区)。 Java对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针两种方式) 拓展问题: String类和常量池 8种基本类型的包装类和常量池 1 概述(为什么要学习Java内存区域) 对于Java程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个new 操作去写对应的delete/free操作,不容易出现内存泄漏和内存溢出问题。正是因为Java程序员把内存控制权利交给Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。 2 运行时数据区域 线程私有的: 程序计数器 虚拟机栈 本地方法栈 线程共享的: 堆 方法区 直接内存 2.1 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。 字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完。 另外, 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为

Windows句柄

杀马特。学长 韩版系。学妹 提交于 2019-12-16 14:05:20
图解说明——究竟什么是Windows句柄 参考资料: http://blog.csdn.net/newjerryj/article/details/4383701 http://www.cnblogs.com/yellowyu/archive/2009/06/07/1497910.html 写在前面: 对于“句柄”,在下一直停留在一知半解的认识层面,近日在下学习Windows编程,决定趁此机会将句柄彻底搞清楚。查阅了一些网络上的资料,发现网络上的讲解大概可以分为两类:一种是以比喻、类比的方式说明,这种方法虽然形象易懂,但并没有从原理上、本质上加以揭示,让人仍然想问“为什么?”、“怎么实现?”。另一种是给出源代码,无可厚非,这当然是最本质的说明了,但这样一来,又显得不够直观,初学者理解起来有一定的难度。鉴于此,在下尽微末之能,结合自己的愚见,在两者之间折中,用图解的方式来将原理呈现出来,做到一目了然。 这里需要说明: 1.这里将句柄所能标识的所有东西(如窗口、文件、画笔等)统称为“对象”。 2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横框表示4个字节。 3.图解的目的是为了直观易懂,所以不一定与源码完全对应,会有一定的简化。 让我们先看图,再解释。 其中,图1是程序运行到某时刻时的内存快照,图2是程序往后运行到另一时刻时的内存快照

设置Linux打开文件句柄/proc/sys/fs/file-max和ulimit -n的区别

会有一股神秘感。 提交于 2019-12-16 11:30:50
max-file 表示系统级别的能够打开的文件句柄的数量。是对整个系统的限制,并不是针对用户的。 ulimit -n 控制进程级别能够打开的文件句柄的数量。提供对shell及其启动的进程的可用文件句柄的控制。这是进程级别的。 对于服务器来说,file-max和ulimit都需要设置,否则会出现文件描述符耗尽的问题。 一般如果遇到文件句柄达到上限时,会碰到"Too many open files"或者Socket/File: Can’t open so many files等错误。 为了让服务器重启之后,配置仍然有效,需要用永久生效的配置方法进行修改。 max-file: 查看系统级别的能够打开的文件句柄的数量,Centos7默认是794168 # cat /proc/sys/fs/file-max 794168 系统级打开最大文件句柄的数量永久生效的修改方法,修改文件,文件末尾加入配置内容: # vim /etc/sysctl.conf fs.file-max = 2000000 然后执行命令,使修改配置立即生效: # sysctl -p ulimit: 查看用户进程级的能够打开文件句柄的数量,Centos7默认是1024 这里设置的是当前shell的当前用户的打开的最大限制,如果当前用户打开多个shell,则每个shell都能打开该最大值 # ulimit -n 1024