windows管道学习-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 3977155
  • 博文数量: 536
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(536)

文章存档

2024年(3)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

分类:

2007-09-28 16:42:08

/*
这段代码主要来源:

原理:
   [pipe 1] -> [cmd.exe] => [pipe 2]

其中cmd.exe为新创建的进程,该进程有一个输入,一个输出,一个错误输出。 在这里将标准输出和错误输出都输入到一个管道(pipe 2)里面的。
在这个小事例中使用了两个管道。

pipe 1 的作用主要是负责cmd.exe的输入工作的, 它从一个文件中读入一部分数据通过管道1(pipe 1)进入到cmd.exe的输入中。
pipe 2 的作用就是将cmd.exe的输出作为管道(pipe 2)的输入,pipe 2 的输出最终是输出到标准输出上,我们就可以看到直接的结果了。

安装完vc, 设置完path环境变量。 我把该文件命名为:pipe.c

编译: cl pipe1.c

自己新件一个文本文件: c:\a.txt
文件内容为:
dir
type a.txt

执行: pipe1 c:\a.txt
看看结果是什么,还是挺有意识的哦。

管道在进程间通信的时候用的还是挺多的。在做这个小测试前最好看看管道的原理知识比较好。
其实这个小测试写的不是很好, 很多该做的错误处理没有做, 但还是可以用来做管道学习用的。
 */

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

#define bufsize 4096

handle hchildstdinrd, hchildstdinwr, hchildstdoutrd, hchildstdoutwr, hinputfile, hstdout;

bool createchildprocess(void);
void writetopipe(void);
void readfrompipe(void);
void errorexit(lpstr);

int main(int argc, tchar *argv[])
{
   security_attributes saattr;
   bool fsuccess;

// set the binherithandle flag so pipe handles are inherited.

   saattr.nlength = sizeof(security_attributes);
   saattr.binherithandle = true;
   saattr.lpsecuritydescriptor = null;

// get the handle to the current stdout.

   hstdout = getstdhandle(std_output_handle);

// create a pipe for the child process's stdout.

   if (!createpipe(&hchildstdoutrd, &hchildstdoutwr, &saattr, 0))
      errorexit("stdout pipe creation failed\n");

// ensure the read handle to the pipe for stdout is not inherited.

   sethandleinformation(hchildstdoutrd, handle_flag_inherit, 0);

// create a pipe for the child process's stdin.

   if (!createpipe(&hchildstdinrd, &hchildstdinwr, &saattr, 0))
      errorexit("stdin pipe creation failed\n");

// ensure the write handle to the pipe for stdin is not inherited.

   sethandleinformation(hchildstdinwr, handle_flag_inherit, 0);

// now create the child process.

   fsuccess = createchildprocess();
   if (!fsuccess)
      errorexit("create process failed with");

// get a handle to the parent's input file.

   if (argc == 1)
      errorexit("please specify an input file");

   printf("\ncontents of %s:\n\n", argv[1]);

   hinputfile = createfile(argv[1], generic_read, 0, null, open_existing, file_attribute_readonly, null);
   if (hinputfile == invalid_handle_value)
      errorexit("createfile failed");

// write to pipe that is the standard input for a child process.

   writetopipe();

// read from pipe that is the standard output for child process.

   readfrompipe();

   return 0;
}

bool createchildprocess()
{
   tchar szcmdline[] = text("cmd");
   process_information piprocinfo;
   startupinfo sistartinfo;
   bool bfuncretn = false;

// set up members of the process_information structure.

   zeromemory(&piprocinfo, sizeof(process_information));

// set up members of the startupinfo structure.

   zeromemory(&sistartinfo, sizeof(startupinfo) );
   sistartinfo.cb = sizeof(startupinfo);
   sistartinfo.hstderror = hchildstdoutwr;
   sistartinfo.hstdoutput = hchildstdoutwr;
   sistartinfo.hstdinput = hchildstdinrd;
   sistartinfo.dwflags |= startf_usestdhandles;

// create the child process.

   bfuncretn = createprocess(null,
      szcmdline, // command line

      null, // process security attributes

      null, // primary thread security attributes

      true, // handles are inherited

      0, // creation flags

      null, // use parent's environment

      null, // use parent's current directory

      &sistartinfo, // startupinfo pointer

      &piprocinfo); // receives process_information


   if (bfuncretn == 0)
      errorexit("createprocess failed\n");
   else
   {
      closehandle(piprocinfo.hprocess);
      closehandle(piprocinfo.hthread);
      return bfuncretn;
   }

   return (true);
}

void writetopipe(void)
{
   dword dwread, dwwritten;
   char chbuf[bufsize];

// read from a file and write its contents to a pipe.

   for (;;)
   {
      if (!readfile(hinputfile, chbuf, bufsize, &dwread, null) || dwread == 0)
          break;

      if (!writefile(hchildstdinwr, chbuf, dwread, &dwwritten, null))
          break;
   }

// close the pipe handle so the child process stops reading.

   if (!closehandle(hchildstdinwr))
      errorexit("close pipe failed\n");
}

void readfrompipe(void)
{
   dword dwread, dwwritten;
   char chbuf[bufsize];

// close the write end of the pipe before reading from the read end of the pipe.

   if (!closehandle(hchildstdoutwr))
      errorexit("closing handle failed");

// read output from the child process, and write to parent's stdout.

   for (;;)
   {
      if (!readfile(hchildstdoutrd, chbuf, bufsize, &dwread, null) || dwread == 0)
          break;

      if (!writefile(hstdout, chbuf, dwread, &dwwritten, null))
          break;
   }
}

void errorexit (lpstr lpszmessage)
{
   fprintf(stderr, "%s\n", lpszmessage);
   exitprocess(0);
}

阅读(4272) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图