双管道(CreatePipe)与本地cmd.exe进程通信(附源代码及编译好的程序,免费下载)

双管道(CreatePipe)与本地cmd.exe进程通信(附源代码及编译好的程序,免费下载)源代码:#include<stdio.h>#include<WINDOWS.H>#defineSEND_BUFF_SIZE1024//实现去除执行结果中的”命令\n”voidprint(char*cmdstr){ while(*((char*)cmdstr++)!=’\n’); printf(cmdstr);}intmai…

大家好,又见面了,我是你们的朋友全栈君。

简介:

在本地,用父进程创建一个cmd.exe子进程,这个子进程的输入输出被重定向到两条匿名管道,从而实现与父进程通信。父进程输入命令到一条管道,子进程读取后执行并输出到另一条管道,父进程读取后输出到窗口。
此版本源代码借鉴并修改、优化了前人的创作,详见:https://blog.csdn.net/aq782645210/article/details/16370409 中的评论

源代码:

#include <stdio.h>
#include <WINDOWS.H>
#define SEND_BUFF_SIZE 1024
 
//实现去除执行结果中的 "命令\n"
void print(char *cmdstr)
{ 
   
	while(*((char*)cmdstr++)!='\n');
	printf(cmdstr);
}
 
 
 
int main()
{ 
   
	HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2; //四个HANDLE 用来创建两个管道
	CHAR Buff[SEND_BUFF_SIZE] = { 
   0};
    CHAR sendBuff[SEND_BUFF_SIZE] = ("dir \n");
 
	//安全属性的东西
    SECURITY_ATTRIBUTES sa;
    sa.nLength=sizeof(sa);
    sa.lpSecurityDescriptor=0;
    sa.bInheritHandle=true;    
    int ret;
	
    if(!CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))//创建两个匿名管道,以改变DOS的标准输入输出
    { 
   
        return -1;
    }
    if(!CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0))
    { 
   
        return -1;
    }
	
	//启动信息
    STARTUPINFO si;
    ZeroMemory(&si,sizeof(si));
    //GetStartupInfo(&si);
    si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    si.wShowWindow = SW_HIDE;
    si.hStdInput = hReadPipe2;
    si.hStdOutput = si.hStdError = hWritePipe1;
	
    char cmdLine[256] = { 
   0};
    GetSystemDirectory(cmdLine,sizeof(cmdLine));
    strcat(cmdLine, ("\\cmd.exe"));
	
    PROCESS_INFORMATION ProcessInformation;
    if(CreateProcess(cmdLine,NULL,NULL,NULL,TRUE,0,NULL,NULL,&si,&ProcessInformation) == 0)
    { 
   
        return -1;
    }
	
 
    unsigned long lBytesRead,lBytesWrite;//存放实际读写字节的变量
	
	while(TRUE){ 
   
		lBytesRead=0;
		Sleep(50);//等待cmd程序执行
		ret=PeekNamedPipe(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0,0);//管道是否有数据可读
		if(lBytesRead)    
		{ 
   
            //第一次可以读到cmd的初始化信息
            ret=ReadFile(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0);//读取管道里的数据
            //如果读到数据,则对数据进行下一步处理
			print(Buff);
			ZeroMemory(Buff,sizeof(Buff));	
		}
		else{ 
   //管道中无数据时输入命令,以回车结束
			
			char ch;
			int count=0;
			ZeroMemory(sendBuff,sizeof(sendBuff));
			while((ch=getchar())!='\n')
			{ 
   
				sendBuff[count]=ch;
				count++;
			}
			sendBuff[count++]='\n';

			if(!WriteFile(hWritePipe2, sendBuff,count,&lBytesWrite,0))//写入数据 
			{ 
   
				printf("WriteFile Error!!\n");
				return -1;
			}
			//等待cmd程序执行
			Sleep(100);
		}
	}
    
}

编译好的程序:

https://pan.baidu.com/s/1VUtnTyqMHnv588RcJweohQ

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159423.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 隐马尔可夫模型_基于hmm模型外汇预测

    隐马尔可夫模型_基于hmm模型外汇预测隐马尔科夫模型,HiddenMarcovModel,是可用于标注问题的统计学习模型,描述由隐藏的马尔科夫链随机生成观测序列的过程,属于生成模型,是一种比较重要的机器学习方法,在语音识别等领域有重要的应用。 本文不打算使用书面的一大堆公式来说明,本人对公式无感,能用例子说明的根本不想碰公式,不知道是不是霍金说过,多加一条公式就会损失一大片读者。PS:不管有没有说过了,是这个意思,what

  • CollectionUtils.isNotEmpty()的使用

    CollectionUtils.isNotEmpty()的使用List<Object>arrayList=newArrayList<Object>();当arrayList的数据为NULL时,可以用CollectionUtils.isNotEmpty()来判断arrayList是否有值CollectionUtils.isNotEmpty()包含null,size=0等多种情况CollectionUtils.isEm…

  • 2017中国程序员薪资生存现状调查报告结论_程序员的收入

    2017中国程序员薪资生存现状调查报告结论_程序员的收入程序员一直都是一个备受人们关注的群体。2014年,据IDC统计,全球约有1850万名程序员,中国占10%。随着近年全国互联网创业热潮的兴起,“互联网+”、“云计算”以及“智能硬件”等领域发展迅速,市场对程序员的需求更为旺盛。  由程序员客栈联合稀土掘金通过对北京、广东、浙江、上海等全国28个省、直辖市及特别行政区的10W+优秀程开发者进行了一次调查。调查报告里对程序员的年龄组成、性别比例、

    2022年10月11日
  • C# 连接SFTP

    C# 连接SFTPC#连接SFTP网上学习到C#连接SFTP方式,整理了一下,文章结尾处为具体的调用方式以及密钥文件的转换。SFTPHelper.c文件:usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Collections.Specialized;usingSystem.Configuration;usingSystem.Linq;usingSystem.Text;using

  • JavaScript之正则表达式的使用方法详细介绍[通俗易懂]

    JavaScript之正则表达式的使用方法详细介绍[通俗易懂]首先必须说明的是,这类文章(js正则表达式)在c站或者整个it类论坛是很多人写过的,而我认为我这篇的不同之处在于更加“小白”化,这也与我一贯的风格有关吧。关于JavaScript正则表达式,其他的文章大多一上来就太过激进,不利于初学者学习(我当粗就是这么被劝退的),这也是我为什么要坚持写这篇文章,希望小白在看了这篇文章后,不管能不能完全掌握JavaScript正则表达式,但至少对JavaScript正则表达式能有一个比较深刻的印象吧。

    2022年10月24日
  • scipy读取不了imread_type object is not iterable

    scipy读取不了imread_type object is not iterable最近在运行代码的时候出现了这个错误——AttributeError:module’scipy.misc’hasnoattribute’imread’。查阅网上资料之后发现,大部分解决办法都是说没有安装PIL第三方库,库名现在为Pillow,推荐直接使用命令pipinstallPillow进行安装,但是我的问题并没有因此得到解决,还是继续报错AttributeError:modu…

    2022年10月14日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号