设为首页 加入收藏

TOP

[操作系统实验]使用命名通道实现进程通信(二)
2019-08-30 00:46:35 】 浏览:93
Tags:操作系统 实验 使用 命名 通道 实现 进程 通信
v[], TCHAR* envp[]) 5 { 6 int nRetCode = 0; 7 int err; 8 BOOL rc; 9 HANDLE hPipeHandle1; 10 11 char lpName[] = "\\\\.\\pipe\\myPipe"; 12 char InBuffer[50] = ""; 13 char OutBuffer[50] = ""; 14 DWORD BytesRead,BytesWrite; 15 16 hPipeHandle1 = CreateNamedPipe((LPCSTR)lpName, 17 PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED|WRITE_DAC, 18 PIPE_TYPE_MESSAGE|PIPE_READMODE_BYTE|PIPE_WAIT, 19 1,20,30,NMPWAIT_USE_DEFAULT_WAIT, 20 (LPSECURITY_ATTRIBUTES)NULL); 21 22 if((hPipeHandle1 == INVALID_HANDLE_VALUE)||(hPipeHandle1 == NULL)) 23 { 24 err = GetLastError(); 25 printf("Server Pipe Create Fail!err = %d\n",err); 26 exit(1); 27 } 28 else printf("Server Pipe Create Success!\n"); 29 30 while(1) 31 { 32 rc = ConnectNamedPipe(hPipeHandle1,(LPOVERLAPPED)NULL); 33 if(rc == 0) 34 { 35 err = GetLastError(); 36 printf("Server Pipe Connect Fail err = %d\n",err); 37 exit(2); 38 } 39 else printf("Server Pipe Connect Success\n"); 40 strcpy(InBuffer,""); 41 strcpy(OutBuffer,""); 42 43 rc = ReadFile(hPipeHandle1,InBuffer,sizeof(InBuffer),&BytesRead,(LPOVERLAPPED)NULL); 44 if(rc == 0 && BytesRead ==0) 45 { 46 err = GetLastError(); 47 printf("Server Read Pipe Fail!err = %d",err); 48 exit(3); 49 } 50 else printf("Server Read Pipe Success!\nDATA from Client is %s\n",InBuffer); 51 rc = strcmp(InBuffer,"end"); 52 if(rc == 0) break; 53 printf("Please Input Data to Send\n"); 54 scanf("%s",OutBuffer); 55 rc = WriteFile(hPipeHandle1,OutBuffer,sizeof(OutBuffer),&BytesWrite,(LPOVERLAPPED)NULL); 56 if(rc == 0) printf("Server Write Pipe Success!\n"); 57 else printf("Server Write Pipe Success!\n"); 58 DisconnectNamedPipe(hPipeHandle1); 59 rc = strcmp(OutBuffer,"end"); 60 if(rc == 0) break; 61 } 62 }

 

CreateNamedPipe:创建一个命名管道实例,并返回该管道的句柄

HANDLE CreateNamedPipe(
  LPCTSTR lpName, //命名管道的名称
  DWORD dwOpenMode, //命名管道的访问模式DWORD dwPipeMode, //命名管道的模式
  DWORD nMaxInstances, //可创建实例的最大值
  DWORD nOutBufferSize, //以字节为单位的输出缓冲区的大小DWORD nInBufferSize, //以字节为单位的输入缓冲区的大小DWORD nDefaul tTimeOut, //默认超时时间
  LPSECURITY_ ATTRIBUTES lpSecur ityAttr ibutes //安全属性
  )

 

ConnectNamedPipe():连接命名管道。创建后的命名管道也等待客户端的连接,客户端可以使用函数CreateFile( )和CallNamedPipe()进行连接 

BOOL ConnectNamedPipe (

  HANDLE hNamedPipe,//命名管道实例句柄
  LPOVERLAPED lpOverlapped  //指向Overlapped结构的指针

)

 

BOOL ReadFile(
   HANDLE hFile, //文件的句柄
   LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
    DWORD nNumberOfBytesToRead, //要读入的字符数
   LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
   LPOVERLAPPED lpOverlapped
  )

BOOL WriteFile(
HANDLE hFile, //文件的句柄
   LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
    DWORD nNumberOfBytesToRead, //要读入的字符数
   LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
   LPOVERLAPPED lpOverlapped
//如文件打开时指定了FILE_FLAG_OVERLAPPED,定义了一次异步读取操作。否则,应将这个参数设为NULL
  )

DisconnectNamedPipe(hPipeHandle1);  //拆除命名管道服务器与客户端的连接

 

 

实验结果

 

该实验完成了两个进程的通信,请大家在下面程序的基础上增加和完善程序的功能,如设计一个聊天室等,使其可以实现自己的设计需求。可以使用命名管道创建命令CreateNamedPipe(),也可以使用文件创建命令CreateFile()来实现其功能,命名管道创建命令CreateNamedPipe()中的参数比较多,要仔细研究其含义,使用不当可能会导致两个进程通信的失败。

 

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇windows系统以及linux系统的优缺.. 下一篇在Windows7中的DPI与主题的问题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目