管道技术

管道技术的使用,其中有一些不太明白的地方,比如在执行 netstat -a 的命令时,反程序的反映速度很慢,要很久时间才能获取到返回值,而执行 netstat -ano 就很快,不知道是什么原因造成的。

还有就是使用动态分配内存时出错,比如下面 (1)换成(2)时:

(1)char result[1024 * 100] = { 0 }; //缓冲区,接收管道返回的数值。
(2)/char *result = malloc(sizeof(char)* 1024 * 100); //这什么这样分配会出错??

关于上面的问题,做了下面的测试发现是因为没有对 动态分配的内存进行初始 memset(result,0,sizeof(char)*1024*100);

下面是main() 这个是执行命令,第二个 main1() 是执行 tasklist 命令后查询相应的程序有没有在运行,和运行了几个此程序。

下是管道通信的图示:


以下是管道的代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int exeshell(char *pcmd,char *result)	//传递指令,返回结果
{	
	FILE *pf = _popen(pcmd, "r");	//打开一个管道,用管道执行pcmd
	if (pf == NULL)
	{
		printf("创建管道失败!\n");
		return 0;
	}
	//feof(FILE);到文件末尾返回1,没有返回 0.
	while (!feof(pf))
	{
		char str[1024] = { 0 };	//读取缓冲区
		fgets(str, 1024, pf);	//fgets()的返回值是读到多少字符。
		strcat(result,str);		//字符拼结。拼结是去掉 \0 
	}
	_pclose(pf);	//关闭管道
	return 1;
}
/* 执行某此命令获得返回值 */
void main()
{
	/* 此处容易发生溢出,最好使用动态分配内存 */
	char result[1024 * 100] = { 0 };	//缓冲区,接收管道返回的数值。
	//char *result = malloc(sizeof(char)* 1024 * 100); //这什么这样分配会出错??
	char cmd[128];
	printf("请输入要执行的命令:"); 
	gets(cmd);	// 当输入 netstat -a 或 netstat -an 不知道什么原因,返回要等太久时间,不知道为什么?
	puts(cmd);
	exeshell(cmd, result);

	printf("%s\n", result);

	//	free(result);
	system("pause");


}
/* 查询运行的程序 */
void main1()
{
	char result[1024*10] = { 0 };	//缓冲区,接收管道返回的数值。

	exeshell("tasklist", result);
		
	printf("%s\n", result);
	
	printf("查询系统运行的程序:");
	char name[200];
	scanf("%s", name);
	
	/*if (str != NULL)
	{
		printf("找到运行的程序!\n");
	}*/
	//查询运行几个QQ.exe
	int sum = 0;
	for (char *p = strstr(result,name); p != NULL;p=strstr(p+strlen(name),name))
	{		
			sum++;		
	}
	printf("检索到:%d 个 %s 在运行......\n", sum,name);

	system("pause");


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值