windows核心编程 内核对象,创建进程(CreateProcess),管道(CreatePipe)

embedded/2024/12/23 6:33:25/

windows_CreateProcessCreatePipe_0">windows核心编程 内核对象,创建进程(CreateProcess),管道(CreatePipe)

windows核心编程 内核对象,创建进程(CreateProcess),管道(CreatePipe)

文章目录

  • windows核心编程 内核对象,创建进程(CreateProcess),管道(CreatePipe)
  • 主进程创建子进程并运行Ping 命令


主进程创建子进程并运行Ping 命令

/*
主进程创建子进程并运行Ping 命令
*/
#include <Windows.h>
#include <tchar.h>
#include <strsafe.h>	#define GRS_USEPRINTF() TCHAR pBuf[1024] = {}
#define GRS_PRINTF(...) \StringCchPrintf(pBuf,1024,__VA_ARGS__);\WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),pBuf,lstrlen(pBuf),NULL,NULL);#define GRS_USEPRINTFA() CHAR pBufA[1024] = {}
#define GRS_PRINTFA(...) \StringCchPrintfA(pBufA,1024,__VA_ARGS__);\WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE),pBufA,lstrlenA(pBufA),NULL,NULL);#define GRS_ALLOC(sz) HeapAlloc(GetProcessHeap(),0,sz)	
#define GRS_CALLOC(sz) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sz)	
#define GRS_SAFEFREE(sz) if(NULL != p){HeapFree(GetProcessHeap(),0,p);p=NULL;}	//获取应用程序所在的路径
void GetAppPath(PTSTR pszPath)
{DWORD dwLen = 0;//获取当前进程已加载模块的文件的完整路径dwLen = GetModuleFileName(NULL, pszPath, MAX_PATH);//NULL表示获取当前exe全路径if (dwLen == 0) return;for (DWORD i = dwLen; i > 0; i--){if ('\\' == pszPath[i]){pszPath[i + 1] = '\0';break;}}
}int _tmain()
{GRS_USEPRINTF();TCHAR pszAppPath[MAX_PATH + 1] = {};TCHAR pszExe[MAX_PATH + 1] = {};GetAppPath(pszAppPath);//获取当前exe文件所在的目录STARTUPINFO si = { sizeof(STARTUPINFO) };PROCESS_INFORMATION pi = {};SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES) };sa.bInheritHandle = FALSE;//该子进程不可继承printf("这是父进程的控制台窗口!\r\n");//重定向到管道,接受ping命令的输出GRS_USEPRINTFA();StringCchPrintf(pszExe, MAX_PATH, _T("PING www.baidu.com"));BYTE pBuffer[1024] = {};//缓存DWORD dwLen = 0;HANDLE hRead1, hWrite1;//管道读写句柄BOOL bRet;sa.bInheritHandle = TRUE;//创建匿名管道,管道句柄是可被继承的bRet = CreatePipe(&hRead1, &hWrite1, &sa, 1024);if (!bRet){GRS_PRINTF(_T("管道创建失败,Error Code:%d\n"), GetLastError());_tsystem(_T("PAUSE"));return 0;}/**/si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;si.wShowWindow = SW_HIDE;//隐藏子进程窗口si.hStdOutput = hWrite1;//将子进程的输出输入通道//创建子进程,ping命令,子进程是可继承的CreateProcess(NULL, pszExe, NULL, NULL, TRUE,DETACHED_PROCESS, NULL, pszAppPath, &si, &pi);//管道句柄已被继承,本地则可关闭,否则管道内核对象没有释放,// 之后的读管道操作人会一直等待管道吸入数据
//	HANDLE pHandle = GetCurrentProcess();//0xfffffff
//	HANDLE tHandle = GetCurrentThread();//0xfffffffe//党ping指向完毕,已经没有数据写入,就会因ReadFile读不到数据,而进程阻塞CloseHandle(hWrite1);printf("执行子进程:运行ping命令!\r\n");//读管道知道管道关闭dwLen = 1000;DWORD dwRead = 0;while (ReadFile(hRead1,pBuffer,dwLen,&dwRead,NULL)){if (0 == dwRead){break;}GRS_PRINTFA("%s\n", pBuffer);ZeroMemory(pBuffer, 1024);}GRS_PRINTF(_T("Read Completion!\n\n"));CloseHandle(hRead1);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);_tsystem(_T("PAUSE"));return 0;
}

http://www.ppmy.cn/embedded/102151.html

相关文章

【C++20】携程库基础知识

文章目录 参考 参考 协程革命

Nginx负载均衡与后端服务器自动扩展:实现高可用性架构

引言 在现代云计算环境中&#xff0c;应用程序的伸缩性变得至关重要。随着用户请求的增减&#xff0c;后端服务器需要自动扩展以适应负载变化。Nginx 作为流行的负载均衡器&#xff0c;可以与多种自动扩展技术配合使用&#xff0c;实现高效的服务伸缩。本文将探讨如何在 Nginx…

智力是学习力,智能是使用力,智慧是创造力

智力、智能和智慧——可以从不同的角度理解为学习力、使用力和创造力。可以更详细地探讨一下这三者的含义及其关系&#xff1a; 智力&#xff08;学习力&#xff09;&#xff1a;智力通常指的是个体学习、理解、分析和解决问题的能力。这包括逻辑推理、记忆、语言理解和其他认知…

linux基础命令(超级详细)

Linux 系统提供了丰富的命令行工具&#xff0c;用于各种文件操作、系统管理和网络配置等任务。以下是一些常用的 Linux 基础命令&#xff1a; 一、 文件和目录操作 1. ls: 列出目录内容 ls 列出当前目录的文件和目录 ls -l 以长格式列出文件和目录&#xff0c;包…

Java-List分批多线程执行

为了实现列表分批多线程执行,并返回结果,默认一次执行100个元素,我们可以创建一个工具类 ListBatchExecutor,它包含一个静态方法 executeInBatches,该方法接收一个列表、一个处理每 个元素的函数以及一个自定义线程池,并利用 CompletableFuture 来并行处理这些元素。 …

后端开发刷题 | 合并k个已排序的链表

描述 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。 数据范围&#xff1a;节点总数 0≤n≤5000&#xff0c;每个节点的val满足 ∣val∣<1000 要求&#xff1a;时间复杂度 O(nlogn) 示例1 输入&#xff1a; [{1,2,3},{4,5,6,7}] 返回值&#xff1a; …

如何克服编程学习中的挫折感?

你是如何克服编程学习中的挫折感的&#xff1f; 编程学习之路上&#xff0c;挫折感就像一道道难以逾越的高墙&#xff0c;让许多人望而却步。然而&#xff0c;真正的编程高手都曾在这条路上跌倒过、迷茫过&#xff0c;却最终找到了突破的方法。你是如何在Bug的迷宫中找到出口的…

jenkins发送html邮件配置步骤与注意事项?

jenkins发送html邮件如何实现&#xff1f;Jenkins的配置方法&#xff1f; 通过jenkins发送html邮件&#xff0c;开发团队可以及时获取构建状态的详细报告&#xff0c;从而快速响应问题&#xff0c;提高工作效率。AokSend将详细介绍jenkins发送html邮件的配置步骤与注意事项&am…