操作系统实验报告(包括线程,进程,文件系统管理,linux+shell简单命令)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验报告

班级:030613

学号:03061331

姓名:裴帅帅

实验一:进程的建立

一、实验内容

创建进程及子进程,在父子进程间实现进程通信,创建进程并显示标识等进

程控制块的属性信息,显示父子进程的通信信息和相应的应答信息。

使用匿名管道实现父子进程之间的通信。

二、源程序

1、创建匿名管道

SECURITY_ATTRIBUTES sa;

sa.bInheritHandle=true;

sa.lpSecurityDescriptor=NULL;

sa.nLength=sizeof(SECURITY_ATTRIBUTES);

if(!CreatePipe(&m_hRead,&m_hWrite,&sa,0))

{

MessageBox("创建匿名管道失败");

return false;

}

2、创建子进程

STARTUPINFO si;

ZeroMemory(&si,sizeof(STARTUPINFO));

si.cb=sizeof(STARTUPINFO);

si.dwFlags=STARTF_USESTDHANDLES;

si.hStdInput=m_hRead;

si.hStdOutput=m_hWrite;

si.hStdError=GetStdHandle(STD_ERROR_HANDLE);

if(!CreateProcess(NULL,"子

进.exe",NULL,NULL,true,0,NULL,NULL,&si,&pi)) {

MessageBox("创建子进程失败");

CloseHandle(m_hRead);

CloseHandle(m_hWrite);

m_hRead=NULL;

m_hWrite=NULL;

return;

}

3、销毁子进程

if(m_hRead)

CloseHandle(m_hRead);

if(m_hWrite)

CloseHandle(m_hWrite);

TerminateProcess(pi.hProcess ,0);

4、向匿名管道中写信息

即发送信息

DWORD deWrite;

CString sendData;

m_s.GetWindowText(sendData);

int length;

length=sendData.GetLength ();

char *buffer=new char[length+1];

for(int i=0;i

{

buffer[i]=sendData[i];

}

buffer[length]='\0';

if(!WriteFile(m_hWrite,buffer,length,&deWrite,NULL))

{

MessageBox("发送数据失败");

}

delete buffer;

5、从匿名管道中读取信息

即接收信息

char buff[100];

DWORD deRead;

if(!ReadFile(m_hRead,buff,100,&deRead,NULL))

{

MessageBox("读取数据失败");

}

CString receiveData;

for(int i=0;i<=(int)deRead;i++)

{

receiveData+=buff[i];

}

receiveData+='\0';

m_r.SetWindowText (receiveData);

三、实验结果

实验结果实现了父进程向匿名管道中写信息,然后在子进程端可以从匿名管道中读取该信息;也可以子进程向管道中写入信息,然后父进程从中读取后显示。

以下是实验结果截图:

1、父进程发送信息

2、子进程接收信息

四、总结分析

本实验用匿名管道实现了父子之间的通信过程,通过本实验要掌握几个MFC 函数包括,创建管道、往管道中写入数据、从管道中读取数据、创建子进程、销

毁子进程等。

实验二:进程间的同步

一、实验内容

实现进程同步和互斥模型,利用通信API实现进程之间的同步,建立司机和售票员进程,并实现他们间的同步运行。

使用事件作为相互竞争的进程的争抢资源,演示过程:司机开车,到站停车,售票员开车门,乘客上车,售票员关门,买票,司机继续开车。

本试验用两条线程演示进程间的相互关系。

二、源程序

1、创建两条线程

两个线程分别基于司机线程(函数)function1,售票员线程(函数)function2建立:

unsigned long threadId1,threadId2;

HANDLE thread1,thread2;

thread1=CreateThread(NULL,0,function1,NULL,0,&threadId1);

thread2=CreateThread(NULL,0,function2,NULL,0,&threadId2); CloseHandle(thread1);

CloseHandle(thread2);

2、创建两个事件作为两个线程各自的独占资源

hMutex1=CreateEvent(NULL,false,false,NULL);

hMutex2=CreateEvent(NULL,false,false,NULL);

其中两个事件变量均为全局变量

设定主线程休眠一定时间

3、司机线程运行函数代码

DWORD WINAPI function1( LPVOID lpParameter)

{

while(true)

{

cout<<"正常行车,到站、停车"<

SetEvent(hMutex2);//V操作

WaitForSingleObject(hMutex1,INFINITE);

ResetEvent(hMutex1); //P操作

cout<<"离站开车"<

}

return 0;

}

4、售票员线程运行函数代码

相关文档
最新文档