当前位置:文档之家› os10-实验四-经典的进程同步问题

os10-实验四-经典的进程同步问题


六、有关的系统功能调用: signal(int sig,int function)//;预置对信号的处理方式
int sig:信号 void (*function) ( ) 接收到指定信号后的处理函数
参数sig
值 名 字 说 明
01
02 03 04
SIGHUP
SIGINT SIGQUIT SIGILL
signal(SIGINT,stop); /*接收到^c信号,转stop*/ waiting( ); kill(p1,16); /*向p1发软中断信号16*/ kill(p2,17); /*向p2发软中断信号17*/ wait(0); /*同步*/ wait(0); printf("Parent process is killed!\n"); exit(0); } else { wait_mark=1; signal(17,stop); /*接收到软中断信号17,转stop*/ waiting( ); lockf(stdout,1,0); printf("Child process 2 is killed by parent!\n"); lockf(stdout,0,0); exit(0); } }
挂起(hangup)
中断,当用户从键盘按^c键或^break键时 退出,当用户从键盘按quit键时 非法指令
05
06 07 08 09 10 11 12 13
SIGTRAP
SIGIOT SIGEMT SIGFPE SIGKILL SIGBUS SIGSEGV SIGSYS SIGPIPE
跟踪陷阱(trace trap),启动进程,跟踪代码的执行
IOT指令 EMT指令 浮点运算溢出 杀死、终止进程 总线错误 段违例(segmentation violation),进程试图去访问其虚地址空间以外的位置 系统调用中参数错,如系统调用号非法 向某个非读管道中写入数据
14
15 16 17 18 19
SIGALRM
SIGTERM SIGUSR1 SIGUSR2 SIGCLD SIGPWR
void waiting( ) { while(wait_mark!=0); } void stop( ) { wait_mark=0; }
八、思考题
1、lockf(stdout,1,0)的作用是什么? 2、该程序段前面部分用了两个wait(0),它们起什么作用? 3、该程序段中每个进程退出时都用了语句exit(0),为什么? 4、为何预期的结果并未显示出? 5、程序该如何修改才能得到正确结果?
//线程2的入口函数
DWORD WINAPI Fun1Proc( LPVOID lpParameter //thread data ) { while(TRUE) { //请求共享对象的使用权 WaitForSingleObject(hMutex,INFINITE); if (tickets>0) cout<<“thread2 sell ticket:”<<tickets--<<endl; else break; //释放对象的所有权 ReleaseMutex( hMutex); } return 0; }
else { wait_mark=1; signal(16,stop); /*接收到软中断信号16,转stop*/ waiting( ); lockf(stdout,1,0); printf("Child process 1 is killed by parent!\n"); lockf(stdout,0,0); exit(0); } }
#include <windows.h> #include <iostream.h> DWORD WINAPI Fun1proc( LPVOID lpPartameter // thread data ); DWORD WINAPI Fun2proc( LPVOID lpPartameter // thread data ); int tickets=100; Handle hMutex; Void main() { HANDLE hThread1; HANDLE hThread2; //创建线程 hThread1=CreateThread(null,0,Fun1Proc,null,0,null); hThread2=CreateThread(null,0,Fun2Proc,null,0,null); CloseHandle(hThread1); CloseHandle(hThread2); //创建互斥对象 hMutex= HANDLE CreateMutex(NULL,FALSE,NULL); sleep(4000) }
//线程1的入口函数 DWORD WINAPI Fun1Proc( LPVOID lpParameter //thread data ) { while(TRUE) { //请求共享对象的使用权 WaitForSingleObject(hMutex,INFINITE); if (tickets>0) cout<<“thread1 sell ticket:”<<tickets--<<endl; else break; //释放对象的所有权 ReleaseMutex( hMutex); } return 0;
闹钟。当某进程希望在某时间后接收信号时发此信号
软件终止(software termination) 用户自定义信号1 用户自定义信号2 某个子进程死 电源故障
七、参考代码
#include <stdio.h> #include <signal.h> #include <unistd.h> void waiting( ),stop( ); int wait_mark; main( ) { int p1,p2,stdout; while((p1=fork( ))= =-1); /*创建子进程p1*/ if (p1>0) { while((p2=fork( ))= =-1); /*创建子进程p2*/ if(p2>0) { wait_mark=1;
Child process1 is killed by parent!
Child process2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed!
实 验 四
• 五、实验要求
1. 阅读有关的参考书,学习系统功能调用 kill(
选做:阅读模拟火车站售票系统和实现进程的管 道通信源代码,查阅有关进程创建、进程互斥、 进程同步的系统功能调用或API,简要解释例程 中用到的系统功能或API的用法,并编辑、编译、 运行程序,记录程序的运行结果,尝试给出合理 的解释。
模拟火车站售票系统
模拟火车站售票系统: 在实际生活中,多人可以同时买票,也就是说火车站的售票系 统是采用多线程技术实现的,主线程创建两个线程(线程1和线 程2)负责销售火车票。 #include <windows.h> #include <iostream.h> DWORD WINAPI Fun1proc(LPVOID lpPartameter); DWORD WINAPI Fun2proc(LPVOID lpPartameter); int tickets=100;
ห้องสมุดไป่ตู้
)、
signal( )的功能及用法
2. 输入实验指导中的参考代码,编译并运行 能否得到
结果?为什么?尝试修改源代码,得到预期的结果。 3. 写实验报告
六、有关的系统功能调用: int kill(pid_t pid, int sig); //向进程组或进程发送信号 pid: 1. pid大于零,pid是信号欲送往的进程的标识。 2.pid等于零,信号将送往所有与调用 kill() 的那个进程属同 一个使用组的进程。 3. pid等于-1,信号将送往所有调用进程有权给其发送信号 的进程,除了进程1(init)。 4. pid小于-1时,信号将送往以-pid为组标识的进程。 sig:准备发送的信号,其值为零则没有任何信号送出
实 验 四
• 一、编程实现生产者—消费者问题
• 二、进程间的通信 • 三、实验目的 • 1. 掌握进程同步的实现算法
(软中断信号)
• 1. 了解什么是信号 • 2. 熟悉LINUX系统中进程之间软中断通信的基本原 理
实 验
四、实验任务

1. 编写程序,创建生产者和消费者进程,生产者进程产生数据并写入缓冲区,消费 者进程取数据并输出,缓冲区能存放四个数据,如果缓冲区满,则生产者不能写 数据,并报警;如果缓冲区空,消费者不能取数据,并报警。(选做,2个生产者, 2个消费者) 2. 编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘 上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两 个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
相关主题