当前位置:首页 > 操作系统上实验报告3
例程5:
管道通信的实验 #include
int i,r,j,k,l,p1,p2,fd[2]; char buf[50],s[50]; pipe(fd);
while((p1=fork())==-1); if(p1==0)
lockf(fd[1],1,0); /*子进程1 执行*/ /*管道写入端加锁*/
sprintf(buf,\printf(\write(fd[1],buf,50); lockf(fd[1],0,0); /*信息写入管道*/ /*管道写入端解锁*/ sleep(5);
j=getpid(); k=getppid();
printf(\exit(0); } else
{ while((p2=fork())==-1); if(p2==0) {
lockf(fd[1],1,0); /*创建子进程2*/ /*子进程2 执行*/ /*管道写入端加锁*/
sprintf(buf,\printf(\write(fd[1],buf,50); lockf(fd[1],0,0); /*信息写入管道*/ /*管道写入端解锁*/ sleep(5); j=getpid(); k=getppid();
printf(\exit(0); } else
{ l=getpid(); wait(0);
if(r=read(fd[0],s,50)==-1) printf(\else
printf(\wait(0);
if(r=read(fd[0],s,50)==-1) printf(\else
printf(\exit(0); } } } }
运行结果:
思考:(1)什么是管道?进程如何利用它进行通信的?解释一下实现方法。
(2)修改睡眠时机、睡眠长度,看看会有什么变化。解释。 (3)加锁、解锁起什么作用?不用它行吗? 答:(1)管道是指能够连接一个写进程和一个读进程、并允许他们以生产者—消费者方式进行通信的一个共享文件,又称pipe文件。由写进程从管道的入端将数据写入管道,而读进程则从管道的出端读出数据来进行通信。
(2)修改睡眠时机和睡眠长度都会引起进程被唤醒的时间不一,因为睡眠时机决定进程在何时睡眠,睡眠长度决定进程何时被唤醒。
(3)加锁、解锁是为了解决临界资源的共享问题。不用它将会引起无法有效的管理数据,即数据会被修改导致读错了数据。
例程7:
软中断信号实验 #include
int i,j,k; int func();
signal(18,func()); if(i=fork()) {
j=kill(i,18); /*创建子进程*/ /*父进程执行*/
/*向子进程发送信号*/
printf(\k=wait();
/*父进程被唤醒*/
printf(\} else
共分享92篇相关文档