进程通信系列-匿名管道

匿名管道只能在本机由父进程至子进程,优点在于子进程方便重定向,常用于应用程序内部

注意判断此进程是父类还是子类,代码长度一般

匿名管道类

#include "stdafx.h"
#include "niming.h"
#include <iostream>
using namespace std;
niming::niming(void)
{
}

niming::~niming(void)
{
}

int niming::build()
{
	SECURITY_ATTRIBUTES sa;
	sa.bInheritHandle=TRUE;
	sa.lpSecurityDescriptor=NULL;
	sa.nLength=sizeof(SECURITY_ATTRIBUTES);
	if(!CreatePipe(&hRead,&hWrite,&sa,0))
	{
		MessageBox(0,"创建失败","error",0);
		return 0;
	}
	STARTUPINFO sui;
	ZeroMemory(&sui,sizeof(STARTUPINFO));
	sui.cb=sizeof(STARTUPINFO);
	sui.dwFlags=STARTF_USESTDHANDLES;
	sui.hStdInput=hRead;
	sui.hStdOutput=hWrite;
	sui.hStdError=GetStdHandle(STD_ERROR_HANDLE);
	PROCESS_INFORMATION ProcessInfo;
	if(CreateProcess("jxyprocess.exe",NULL,NULL,NULL,TRUE,0,NULL,NULL,&sui,&ProcessInfo))
		return 1;
	else return 0;
}

int niming::send(CString con)
{
	DWORD d;
	if(WriteFile(hWrite,con,con.GetLength()+1,&d,NULL))return 1;
	return 0;
}
CString niming::recv()
{
	DWORD dwRead;
	char ss[1024];
	if(ReadFile(hRead , ss ,1024,&dwRead,NULL))return ss;
	return "";
}
void niming::connect()
{
	hRead=GetStdHandle(STD_INPUT_HANDLE);
	hWrite=GetStdHandle(STD_OUTPUT_HANDLE);
	return;
}
int niming::have()
{
	bool s=cin.eof();
	DWORD d;
	int pid;
	char ss[1024];
	if(!s)
	{
		ReadFile(hRead , ss ,1024,&d,NULL);
		sscanf(ss,"pid-%d",&pid);
		if(pid==getpid())s=1;
		WriteFile(hWrite,ss,1024,&d,NULL);
	}
	return !s;
}
时间: 2025-01-28 03:34:44

进程通信系列-匿名管道的相关文章

Python进程通信之匿名管道实例讲解_python

匿名管道 管道是一个单向通道,有点类似共享内存缓存.管道有两端,包括输入端和输出端.对于一个进程的而言,它只能看到管道一端,即要么是输入端要么是输出端. os.pipe()返回2个文件描述符(r, w),表示可读的和可写的.示例代码如下: 复制代码 代码如下: #!/usr/bin/python import time import os def child(wpipe):     print('hello from child', os.getpid())     while True:   

Linux下C编程,进程通信之无名管道通信

最近在看进程间的通信,下面说说管道通信之无名管道. 1.概述 管道是Linux中很重要的一种通信方式,他是把一个程序的输出直接连接到另一个程序的输入,并且管道具有队列的特性.如Linux命令,"ps -ef | grep root".如下图所示: 2.无名管道 2.1特点 (1)它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间). (2)它是一个半双工的通信模式,具有固定的读端和写端. (3)管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read.w

进程通信系列-消息缓冲

  消息缓冲机制就是把消息直接放在结构体里,以消息进行传输,缺点在于数据长度有限制,容易出错,优点在于可以多窗口传输,即时传输 消息缓冲类:(接受代码是重载一个消息函数,放在最后exe代码中展现) #include "stdafx.h" #include "copyData.h" CString name,content; COPYDATASTRUCT cd; copyData::copyData(void) { cd.dwData=0; } copyData::~

进程通信系列-单向邮槽

      单向邮槽可以用于局域网的不可靠单向广播,代码长度一般,功能一般        缺点:不可靠,单向        优点:简单,不必关心协议 单向邮槽类: #include "stdafx.h" #include "mailslot.h" mailslot::mailslot(void) { hmail=NULL; } mailslot::~mailslot(void) { if(hmail) CloseHandle(hmail); } int mailsl

进程通信系列-共享内存

共享内存是最简单的方法,但要注意是要限制长度,只能是定长的,而且要加以判断有没有获取过 共享内存类: #include "stdafx.h" #include "share.h" #pragma data_seg("have_jxy")//共享数据段还有种方法是内存映射 char m[2000]="";//必须是定长,不然会卡死 #pragma data_seg() #pragma comment(linker,"/

C#中使用命名管道进行进程通信的实例

原文:C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为"Windows 应用程序".整个程序的结构如下图所示.     2 实现项目Client Client仅包含一个名为"客户端"的窗体,如下图所示.   编写窗体后端代码,如下所示. using System; using System.IO; using System.IO.Pipes; using

命名管道进程通信

命名管道进程通信 效果:server读取client发送的字符串.   server:   client:   control:   运行效果

Linux进程间通信——使用匿名管道

在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式--匿名管道,通过它进程间可以交换更多有用的数据.   一.什么是管道 如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号"|"来使用管道,但是管理的真正定义是什么呢?管道是一个进程连接数据流到另一个进程的通道,它通常是用作把一个进程的输出通过管道连接到另一个进程的输入.   举个例子,在shell中输入

IPC——匿名管道

 Linux进程间通信--使用匿名管道 在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式--匿名管道,通过它进程间可以交换更多有用的数据.   一.什么是管道 如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号"|"来使用管道,但是管理的真正定义是什么呢?管道是一个进程连接数据流到另一个进程的通道,它通常是用作把一个进程的输出通过管道连接到另一个进程的