操作系统上实验报告3 联系客服

发布时间 : 星期一 文章操作系统上实验报告3更新完毕开始阅读70d9b10283c4bb4cf7ecd1ac

例程5:

管道通信的实验 #include #include main() {

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 #include main() {

int i,j,k; int func();

signal(18,func()); if(i=fork()) {

j=kill(i,18); /*创建子进程*/ /*父进程执行*/

/*向子进程发送信号*/

printf(\k=wait();

/*父进程被唤醒*/

printf(\} else