西电计算机操作系统进程通信Word文档格式.docx

上传人:b****6 文档编号:18987215 上传时间:2023-01-02 格式:DOCX 页数:20 大小:45.18KB
下载 相关 举报
西电计算机操作系统进程通信Word文档格式.docx_第1页
第1页 / 共20页
西电计算机操作系统进程通信Word文档格式.docx_第2页
第2页 / 共20页
西电计算机操作系统进程通信Word文档格式.docx_第3页
第3页 / 共20页
西电计算机操作系统进程通信Word文档格式.docx_第4页
第4页 / 共20页
西电计算机操作系统进程通信Word文档格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

西电计算机操作系统进程通信Word文档格式.docx

《西电计算机操作系统进程通信Word文档格式.docx》由会员分享,可在线阅读,更多相关《西电计算机操作系统进程通信Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。

西电计算机操作系统进程通信Word文档格式.docx

2.总体设计

管道一

先由父进程创建一个匿名管道,再由父进程获得读写句柄,构建读写的方式;

由父进程创建子进程,实现父进程一样的通信功能。

管道二

二、详细实现

1、父进程的实现

1)消息以及成员函数和成员变量的声明

public:

afx_msgvoidOnBnClickedBtnCreatePipe();

//创建匿名管道

afx_msgvoidOnBnClickedBtnWritePipe();

//写匿名管道

afx_msgvoidOnBnClickedBtnReadPipe();

//读匿名管道

voidParentReadPipe(void);

//定义父进程读匿名管道的成员函数

voidParentWritePipe(void);

//定义父进程写匿名管道的成员函数

voidCreateSecurityAttributes(PSECURITY_ATTRIBUTESpSa);

//创建SECURITY_ATTRIBUTES结构的成员函数

voidCreateStartUpInfo(LPSTARTUPINFOlpStartUpInfo);

//创建STARTUPINFO结构的成员函数

voidCreateNoNamedPipe(void);

//创建匿名管道的成员函数

//分别代表要从匿名管道中读的数据和要写到匿名管道中的数据

CStringm_CStrReadPipe;

CStringm_CStrWritePipe;

//保存创建匿名管道后所得到的对匿名管道的读写句柄

HANDLEhPipeRead;

HANDLEhPipeWrite;

//保证匿名管道只创建一次

BOOLm_PipeIsCreated;

2)消息处理函数

//创建匿名管道按钮的消息处理函数

voidCNoNamedPipeParentDlg:

:

OnBnClickedBtnCreatePipe()

{

if(m_PipeIsCreated==FALSE)

{

this->

CreateNoNamedPipe();

}

}

//写入数据到匿名管道中按钮的消息处理函数

OnBnClickedBtnWritePipe()

ParentWritePipe();

//从匿名管道中读取数据按钮的消息处理函数

OnBnClickedBtnReadPipe()

ParentReadPipe();

//接收数据

ParentReadPipe(void);

//发送数据

ParentWritePipe(void)

//创建SECURITY_ATTRIBUTES结构

CreateSecurityAttributes(PSECURITY_ATTRIBUTESpSa)

//这里必须将bInheritHandle设置为TRUE,

//从而使得子进程可以继承父进程创建的匿名管道的句柄

pSa->

bInheritHandle=TRUE;

lpSecurityDescriptor=NULL;

nLength=sizeof(SECURITY_ATTRIBUTES);

//用来初始化新进程的STARTUPINFO成员

CreateStartUpInfo(LPSTARTUPINFOlpStartUpInfo)

//创建匿名管道

CreateNoNamedPipe(void);

2、子进程的实现

1)消息以及成员函数和成员变量的声明:

protected:

HICONm_hIcon;

//生成的消息映射函数

virtualBOOLOnInitDialog();

afx_msgvoidOnPaint();

afx_msgHCURSOROnQueryDragIcon();

DECLARE_MESSAGE_MAP()

//保存从父进程得到针对于匿名管道的读写句柄

//子进程读取匿名管道

voidChildReadPipe(void);

//子进程写匿名管道

voidChildWritePipe(void);

//子进程获取从父进程处继承得到的关于匿名管道的读写句柄

voidGetReadWriteHandleFromParent(void);

//只需要获取一次匿名管道的读写句柄即可

BOOLm_IsGettedParentHandle;

//往匿名管道中写入数据按钮的消息处理函数

voidCNoNamedPipeChildDlg:

//如果子进程还没有获得对匿名管道的读写句柄的话需要先获取句柄

GetReadWriteHandleFromParent();

ChildWritePipe();

ChildReadPipe();

//从匿名管道读取数据成员函数

ChildReadPipe(void);

//往匿名管道中写入数据

ChildWritePipe(void)

//需要获取继承自父进程的匿名管道读写句柄

GetReadWriteHandleFromParent(void)

if(this->

m_IsGettedParentHandle==FALSE)

hPipeRead=GetStdHandle(STD_INPUT_HANDLE);

hPipeWrite=GetStdHandle(STD_OUTPUT_HANDLE);

m_IsGettedParentHandle=TRUE;

三、实验结果

启动父进程可执行文件,并单击创建匿名管道按钮,此时会弹出子进程窗口(新建了进程):

再在父进程的左边文本框中输入数据,单击写入数据按钮:

再在子进程窗口中单击读取数据按钮

四、心得体会

通过本次试验,更深入的了解了进程间通信中使用管道通信的方法,这种方法只能在父子进程之间通信,不能使用在其他地方,但在本地通信之间效率很高。

六、附录

1、父进程

constintdataLength=100;

CNoNamedPipeParentDlg:

CNoNamedPipeParentDlg(CWnd*pParent/*=NULL*/)

:

CDialogEx(CNoNamedPipeParentDlg:

IDD,pParent)

m_CStrReadPipe(_T("

"

))

m_hIcon=AfxGetApp()->

LoadIcon(IDR_MAINFRAME);

m_PipeIsCreated=FALSE;

DoDataExchange(CDataExchange*pDX)

CDialogEx:

DoDataExchange(pDX);

DDX_Text(pDX,IDC_EDIT_WRITE_PIPE,m_CStrWritePipe);

DDX_Text(pDX,IDC_EDIT_READ_PIPE,m_CStrReadPipe);

BEGIN_MESSAGE_MAP(CNoNamedPipeParentDlg,CDialogEx)

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BTN_CREATE_PIPE,

&

OnBnClickedBtnCreatePipe)

ON_BN_CLICKED(IDC_BTN_WRITE_PIPE,

OnBnClickedBtnWritePipe)

ON_BN_CLICKED(IDC_BTN_READ_PIPE,

OnBnClickedBtnReadPipe)

END_MESSAGE_MAP()

ParentReadPipe(void)

DWORDdwRead;

char*pReadBuf;

CStringcStrRecvData;

pReadBuf=newchar[dataLength];

memset(pReadBuf,0,dataLength);

if(!

ReadFile(hPipeRead,pReadBuf,dataLength,&

dwRead,NULL))

MessageBox(TEXT("

从匿名管道接收数据失败..."

),

TEXT("

提示"

),MB_ICONERROR);

return;

cStrRecvData="

从匿名管道接收数据成功:

"

;

cStrRecvData+=pReadBuf;

m_CStrReadPipe.Empty();

m_CStrReadPipe=pReadBuf;

UpdateData(FALSE);

MessageBox(cStrRecvData,TEXT("

),MB_ICONINFORMATION);

UpdateData();

this->

m_CStrWritePipe.IsEmpty())

char*pSendData;

DWORDdwWrite;

CStringcStrSendData;

//在这里需要将Unicode字符集转换为ASCII字符集

pSendData=newchar[this->

m_CStrWritePipe.GetLength()+1];

memset(pSendData,0,this->

m_CStrWritePipe.GetLength()+1);

for(inti=0;

i<

m_CStrWritePipe.GetLength();

i++)

pSendData[i]=(char)this->

m_CStrWritePipe.GetAt(i);

WriteFile(hPipeWrite,pSendData,

m_CStrWritePipe.GetLength()+1,&

dwWrite,NULL))

给匿名管道发送数据失败..."

cStrSendData="

给匿名管道发送数据成功:

cStrSendData+=this->

m_CStrWritePipe;

m_CStrWritePipe.Empty();

MessageBox(cStrSendData,TEXT("

else

请先输入要发送给匿名管道的数据..."

memset(lpStartUpInfo,0,sizeof(STARTUPINFO));

lpStartUpInfo->

cb=sizeof(STARTUPINFO);

dwFlags=STARTF_USESTDHANDLES;

//子进程的标准输入句柄为父进程管道的读数据句柄

hStdInput=hPipeRead;

//子进程的标准输出句柄为父进程管道的写数据句柄

hStdOutput=hPipeWrite;

//子进程的标准错误处理句柄和父进程的标准错误处理句柄一致

hStdError=GetStdHandle(STD_ERROR_HANDLE);

CreateNoNamedPipe(void)

SECURITY_ATTRIBUTESsa;

PROCESS_INFORMATIONprocessInfo;

STARTUPINFOstartUpInfo;

CreateSecurityAttributes(&

sa);

CreatePipe(&

hPipeRead,&

hPipeWrite,&

sa,0))

创建匿名管道失败..."

CreateStartUpInfo(&

startUpInfo);

CreateProcess(TEXT("

NoNamedPipeChild.exe"

NULL,NULL,NULL,TRUE,

CREATE_NEW_CONSOLE,NULL,NULL,

startUpInfo,&

processInfo))

CloseHandle(hPipeRead);

CloseHandle(hPipeWrite);

hPipeWrite=NULL;

hPipeRead=NULL;

创建子进程失败..."

m_PipeIsCreated=TRUE;

//对于processInfo.hProcess和processInfo.hThread

//这两个句柄不需要使用,所以释放资源

CloseHandle(processInfo.hProcess);

CloseHandle(processInfo.hThread);

2、子程序

//实现

CNoNamedPipeChildDlg:

CNoNamedPipeChildDlg(CWnd*pParent/*=NULL*/)

CDialogEx(CNoNamedPipeChildDlg:

m_CStrWritePipe(_T("

m_IsGettedParentHandle=FALSE;

DDX_Text(pDX,IDC_EDIT_WRITE_PIPE,m_CStrWri

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1