使用CreateNamedPipe进行 进程通信的示例

使用CreateNamedPipe进行 进程通信的示例。

#include<iostream>
#include<windows.h>
#include<ctime>
using namespace std;
DWORD WINAPI thread1(LPVOID param)
{
char buf[256];
DWORD rlen=0;
HANDLE hPipe = CreateNamedPipe(TEXT("\\\\.\\Pipe\\mypipe"),PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT
   ,PIPE_UNLIMITED_INSTANCES,0,0,NMPWAIT_WAIT_FOREVER,0);//创建了一个命名管道
if(ConnectNamedPipe(hPipe, NULL)==NULL)//等待另一客户的链接。
{
   cerr<<"链接失败!"<<endl;
}
else
{
   cerr<<"链接成功"<<endl;
}
l:
if(ReadFile(hPipe,buf,256,&rlen,NULL)==FALSE)//读取管道中的内容(管道是一种特殊的文件)
{
   CloseHandle(hPipe);//关闭管道
   cerr<<"read data from Pipe failed!"<<endl;
}
else
{
   cout<<"thread1 get data="<<buf<<" size="<<rlen<<endl;

   char wbuf[256]="hahaha";
   sprintf(wbuf,"%s   %d",wbuf,rand()%1000);
   DWORD wlen=0;
   WriteFile(hPipe,wbuf,sizeof(wbuf),&wlen,0);
   cout<<"thread1 write data to pipe,data="<<wbuf<<" size="<<wlen<<endl;//收完发
   _sleep(1000);
   goto l;//如果接收成功,则继续接收。
}
return 0;
}
DWORD WINAPI thread2(LPVOID param)
{
char buf[256]="lauo pipe test...\0\0";
sprintf(buf,"%s   %d",buf,rand()%1000);
DWORD wlen=0;
Sleep(1000);//等待pipe的创建成功!
if (WaitNamedPipe(TEXT("\\\\.\\Pipe\\mypipe"), NMPWAIT_WAIT_FOREVER) == FALSE)
{
   cerr<<"connect the namedPipe failed!"<<endl;
   return 0;
}
HANDLE hPipe=CreateFile(TEXT("\\\\.\\Pipe\\mypipe"), GENERIC_READ | GENERIC_WRITE, 0,
   NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if((long)hPipe==-1)
{
   cerr<<"open the exit pipe failed!"<<endl;
   return 0;
}
while(1)
{
   if(WriteFile(hPipe,buf,sizeof(buf),&wlen,0)==FALSE)
   {
    cerr<<"write to pipe failed!"<<endl;
   }
   else
   {
    cout<<"write size="<<wlen<<endl;
    char rbuf[256];
    DWORD rlen=0;
    ReadFile(hPipe,rbuf,sizeof(rbuf),&rlen,0);//这里可以测试,一发必先有一收(另一进程中),否则将无法继续(阻塞式)
    cout<<"thread2 read from pipe data="<<rbuf<<" size="<<rlen<<endl<<endl;
   }
   _sleep(1000);
}
return 0;
}
int main()
{

srand((unsigned)time(NULL));
CreateThread(0,0,thread1,0,0,0);
CreateThread(0,0,thread2,0,0,0);
while(1) Sleep(1000);
return 1;
}

### 回答1: Dart 中可以使用命名管道来实现进程间通信。以下是在 Windows 下使用命名管道进行进程间通信的示例代码: ```dart import 'dart:io'; // 创建服务端 void server() { var server = NamedPipeServer('\\\\.\\pipe\\my_pipe'); server.listen((pipe) { pipe.write('Hello, client!'); pipe.flush(); pipe.close(); server.close(); }); } // 创建客户端 void client() { var client = NamedPipeClient('\\\\.\\pipe\\my_pipe'); client.connect().then((pipe) { pipe.listen((data) { print('Received: $data'); pipe.close(); }); }); } void main() { var isServer = bool.fromEnvironment("server", defaultValue: false); if (isServer) { server(); } else { client(); } } ``` 上面的示例中,服务端使用了 NamedPipeServer 来创建命名管道,并监听客户端的连接。客户端使用 NamedPipeClient 来连接命名管道,并监听服务端的数据。 可以通过在终端运行 dart file.dart server 启动服务端,或者运行 dart file.dart 启动客户端来运行上面的示例。 ### 回答2: Dart 是一种使用面向对象编程思想的编程语言,具有灵活性和高效性,可用于开发跨平台的应用程序。在 Dart 中,可以使用命名管道来实现进程间的通信。下面是一个使用 Dart 实现进程间通信的 Windows 示例。 在 Windows 系统中,可以使用 Win32 API 来创建和管理命名管道。首先,需要导入 dart:ffi 包并定义需要使用的 Win32 API 函数,如 CreateNamedPipe、ConnectNamedPipe、WriteFile 和 ReadFile 等。接下来,可以通过调用这些函数来创建命名管道,并向其中写入和读取数据。 首先,我们可以使用 CreateNamedPipe 函数来创建一个命名管道。例如: ``` final path = r'\\.\pipe\my_named_pipe'; // 定义管道的名称 final pipe = CreateNamedPipe( path, PipeOpenMode.PIPE_ACCESS_DUPLEX, PipeMode.PIPE_TYPE_MESSAGE | PipeMode.PIPE_READMODE_MESSAGE | PipeMode.PIPE_WAIT, PipeUnlimitedInstances, PipeBufferInSize, PipeBufferOutSize, PipeDefaultTimeOut, nullptr, // 默认安全属性 ); if (pipe == INVALID_HANDLE_VALUE) { // 命名管道创建失败 return; } ``` 接下来,使用 ConnectNamedPipe 函数来监听管道连接请求。示例如下: ``` final isSuccess = ConnectNamedPipe(pipe, nullptr); if (!isSuccess && GetLastError() != ERROR_PIPE_CONNECTED) { // 命名管道连接失败 CloseHandle(pipe); return; } ``` 然后,可以使用 WriteFile 函数来向管道中写入数据。示例如下: ``` final message = 'Hello, Pipe!'; final bytes = Utf8Encoder().convert(message); final bytesWritten = Uint32List(1); WriteFile( pipe, bytes.buffer.asPointer(), bytes.lengthInBytes, bytesWritten, nullptr, ); ``` 最后,使用 ReadFile 函数来从管道中读取数据。示例如下: ``` final buffer = Uint8List(PipeBufferInSize); final bytesRead = Uint32List(1); ReadFile( pipe, buffer.buffer.asPointer(), PipeBufferInSize, bytesRead, nullptr, ); ``` 以上就是使用 Dart 在 Windows 系统中实现进程间通信的命名管道示例。通过使用命名管道,我们可以方便地在不同的进程之间传递数据,实现进程间的通信。 ### 回答3: Dart是一种流行的编程语言,可以用于开发跨平台的应用程序。在Windows操作系统中,进程间通信是一个重要的机制,用于不同进程之间的数据传输和共享。 Dart提供了一个命名管道(Named Pipe)的概念,作为进程间通信的一种方式。命名管道允许不同进程之间通过共享的管道进行双向通信。以下是一个使用Dart的命名管道进行进程间通信的示例: 1. 首先,我们需要创建一个命名管道。在Dart中,可以使用`File`类来创建和操作文件,因此我们可以使用`File`类的`create`方法来创建命名管道,例如: ```dart import 'dart:io'; void createNamedPipe() { var pipe = File(r'\\.\pipe\myNamedPipe'); pipe.createSync(); } ``` 2. 接下来,我们可以创建一个进程,用于读取和写入命名管道的数据。在Dart中,可以使用`Process`类来创建和操作进程,可以使用`Process.start`方法创建一个新进程,并指定要执行的命令和参数,例如: ```dart import 'dart:io'; void createProcess() async { var process = await Process.start('myProcess.exe', []); // 通过进程的标准输入,写入数据到命名管道 process.stdin.writeln('Hello from Dart!'); // 通过进程的标准输出,读取命名管道中的数据 print(await process.stdout.transform(utf8.decoder).join()); } ``` 3. 在命名管道的另一端,我们可以创建另一个Dart进程来读取和写入管道中的数据,方法类似于上述步骤。 总之,使用Dart的命名管道进行进程间通信,在Windows操作系统中是一种可行的方法。通过创建命名管道和使用`Process`类,我们可以实现进程之间的数据传输和共享。这为我们开发更复杂的应用程序提供了便利,例如多进程的服务器或基于管道的并行处理程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值