进程间通信(二):利用匿名管道

来源:互联网 发布:c51单片机 定时器计时 编辑:程序博客网 时间:2024/06/07 09:05

进程间通信(二):利用匿名管道

进程间通信的四种方式

1)  剪贴板

2)  匿名管道

3)  命名管道

4)  邮槽

使用CreatePipe函数来创建匿名管道,由于匿名管道只能实现在父进程和子进程之间进行通信,所以在父进程创建完匿名管道之后,利用CreateProcess来创建子进程,然后通过ReadFileWriteFile来实现从管道中读取和写入数据。

下面为父进程创建匿名管道及创建子进程的代码:

       SECURITY_ATTRIBUTES sa;

       sa.bInheritHandle=TRUE;

       sa.lpSecurityDescriptor=NULL;

       sa.nLength=sizeof(SECURITY_ATTRIBUTES);

       if(!CreatePipe(&m_hread,&m_hwrite,&sa,0))

       {

              MessageBox("创建匿名管道失败/n");

              return ;

       }

       STARTUPINFO startinfo;

       ZeroMemory(&startinfo,sizeof(STARTUPINFO));

       startinfo.cb=sizeof(STARTUPINFO);

       startinfo.dwFlags=STARTF_USESTDHANDLES;

       startinfo.hStdInput=m_hread;

       startinfo.hStdOutput=m_hwrite;

       startinfo.hStdError=GetStdHandle(STD_ERROR_HANDLE);

 

       PROCESS_INFORMATION pi;

       if(!CreateProcess("..//child//Debug//child.exe",NULL,NULL,NULL,

                     TRUE,0,NULL,NULL,&startinfo,&pi))

       {

              MessageBox("创建子进程失败/n");

        CloseHandle(m_hread);

              CloseHandle(m_hwrite);

                     return ;

       }

       else

       {

              CloseHandle(pi.hProcess);

              CloseHandle(pi.hThread);

       }

下面为从管道中读取数据的代码:

       char buf[100];

       DWORD readcount;

       if(!ReadFile(m_hread,buf,100,&readcount,NULL))

       {

              MessageBox("读取数据失败/n");

              return ;

       }

       MessageBox(buf);

下面为从管道中写入数据的代码:

       char buf[]="welcome to my blog!";

       int len=strlen(buf)+1;

       DWORD writecount;

       if(!WriteFile(m_hwrite,buf,len,&writecount,NULL))

       {

              MessageBox("写入数据失败/n");

              return ;

       }

面为子进程中设置读写句柄的代码:

m_hread=GetStdHandle(STD_INPUT_HANDLE);

m_hwrite=GetStdHandle(STD_OUTPUT_HANDLE);

而子进程中从管道中读取和写入数据的代码同父进程中读取和写入数据的代码。

原创粉丝点击