操作系统实验报告(包括线程,进程,文件系统管理,linux+shell简单命令)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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、售票员线程运行函数代码