管道技术的使用,其中有一些不太明白的地方,比如在执行 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");
}