欢迎各位学弟学妹收藏操作系统上机详解,大家有空也可以看看这篇文章哦——西电计科课程学习
实验3:信号通信
一、实验目的
利用信号通信机制在父子进程及兄弟进程间进行通信。
二、实验内容
父进程创建一个有名事件,由子进程发送事件信号,父进程获取事件信号后进行相应的处理。
三、程序框架
父进程:
#include "process.h"
#include "windows.h"
#include "iostream.h"
int main( )
{
CreateEvent( …) /*创建一个有名事件*/
if(!CreateProcess(… )) /*创建子进程*/
{
/*打印“创建子进程失败!”*/
/*退出*/
}
/*打印"Wait for event."*/
if(WAIT_FAILED==WaitForSingleObject(…))/*等待事件信号*/
{
/*打印“等待事件信号失败!”*/
/*退出*/
}
/*打印"Get the event"*/
return 0;
}
子进程:
#include "process.h"
#include "windows.h"
#include "iostream.h"
int main( )
{
OpenEvent(… )/*打开命名事件*/
/*休眠一段时间*/
/*打印“Signal the event to Parent?[y\\n]”*/
/*确定是否发送信号*/
SetEvent(… )/*将事件置为有信号状态*/
/*休眠一段时间*/
return 0;
}
创建事件函数:
HANDLE CreateEvent( //创建事件
LPSECURITY_ATTRIBUTES lpEventAttributes, // SD
BOOL bManualReset, // reset type
BOOL bInitialState, // initial state
LPCTSTR lpName // object name
);
创建子进程函数:
BOOL CreateProcess( //创建子进程
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles, // handle inheritance option
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInformation // process information
);
四、源代码
父进程:
#include<stdio.h>
#include<windows.h>
static int count;//定义全局共享数据
DWORD WINAPI ThreadProc(LPVOID IpParameter)//线程函数,其中规定了线程要做的事
{
printf("新线程运行!\n\n");
for(count=1;count<=10;count=count+2)//在线程中直接引用count变量进行更改并输出新数据
{
printf("Now,线程count = %d\n\n",count);
}
printf("线程等待3秒钟...\n\n");
Sleep(3000);//设置3s的等待时间
return 0;//退出运行
}
int main()
{
count=20;
printf("进程运行!\n\n进程count=%d\n\n",count);//显示count变量初值
HANDLE hEvent=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);//创建新线程并定义相关线程信息
WaitForSingleObject(hEvent,INFINITE);//等待线程运行结束
CloseHandle(hEvent);//关闭句柄
printf("新线程结束!\n");
printf("进程结束!\n\n");
printf("Now,count = %d",count);//显示count变量的最终值
return 0;
}
子进程:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int main()
{
HANDLE hEvent=OpenEvent(EVENT_ALL_ACCESS,TRUE,"event");//打开命名事件
//OpenEvent是一个函数,可以用来执行返回事件对象的句柄
Sleep(1000);
printf("Signal the event to Parent?[Y\\N]:");
char ch;
scanf("%c", &ch);//接收字符
if(ch=='Y')
{
SetEvent(hEvent); //将事件置为有信号状态
}
else
{
return 0; //退出
}
Sleep(5000); //休眠一段时间
return 0;
}
五、程序运行结果