进程的管道通信实验项目名称 实验六:进程的管道通信实验目的 1、了解什么是管道2、熟悉UNIX/LINUX支持的管道通信方式实验要求 1、熟悉管道的原理和应用2、掌握pipe(),read(),write()等函数的应用3、掌握进程间管道通信实验原理 1、pipe( )建立一无名管道。系统调用格式 pipe(filedes)参数定义int pipe(filedes);int filedes[2];其中,filedes[1]是写入端,filedes[0]是读出端。该函数使用头文件如下:#include #inlcude #include 2、read( ) 系统调用格式 read(fd,buf,nbyte) 功能:从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buf所指示的缓冲区中。如该文件被加锁,等待,直到锁打开为止。 参数定义 int read(fd,buf,nbyte); int fd; char *buf; unsigned nbyte; 3、write( )系统调用格式 write(fd,buf,nbyte)功能:把nbyte 个字节的数据,从buf所指向的缓冲区写到由fd所指向的文件中。如文件加锁,暂停写入,直至开锁。参数定义同read( )。实验仪器 装linux的pc一台实验步骤 1、根据参考6.C写入linux中2、#gcc -o 6 6.C3、#./6 | > 6out4、6out为程序输出实验内容 #include main(){int i,r,p1,p2,fd[2];char buf[50],s[50];pipe(fd); /*创建匿名管道,fd[0]为读端,fd[1]为写端*/while((p1=fork())==-1); /*创建子进程P1,直至成功为止(p1!=-1)*/if(p1==0) /*子进程P1执行逻辑*/{lockf(fd[1],1,0); /*锁定管道写端,保证写入数据的完整性*/sprintf(buf,"child process P1 is sending messages!\n"); /*在buf中填入准备写入管道的信息数据*/printf("child processP1!\n"); /*打印“子进程P1正在运行”*/write(fd[1],buf,50); /*向管道写端fd[1]写入buf中的数据,写完后该数据即可以从读端fd[0]读出*/sleep(5); /*睡眠5秒*/lockf(fd[1],0,0); /*解锁管道写端*/exit(0); /*子进程P1退出*/}else /*主进程的执行逻辑*/{while((p2=fork())==-1); /*创建第二个子进程P2*/if(p2==0) /*子进程P2的执行逻辑*/{lockf(fd[1],1,0); /*锁定管道写端,保证数据写入完整*/sprintf(buf,"child process P2 is sending messages!\n"); /*在buf中填入准备写入管道的信息数据*/printf("child processP2!\n"); /*打印“子进程P2正在运行”*/write(fd[1],buf,50); /*向管道写端fd[1]写入buf中的数据,写完后该数据即可从读端fd[0]读出*/sleep(5); /*睡眠5秒*/lockf(fd[1],0,0); /*解锁管道写端*/exit(0); /*子进程P2退出*/}/*以下为主进程执行逻辑*/wait(0); /*等待某个子进程退出*/if(r=read(fd[0],s,50)==-1) /*从管道读端fd[0]读取P1或者P2写入的数据(视哪个子进程抢先执行到lockf函数)*/lwfree.cnelse{printf(:%s\n",s); /*打印出读到的信息数据*/}wait(0); /*等待第二个子进程退出*/if(r=read(fd[0],s,50)==-1) /*从管道读端fd[0]读取出P1或者P2写入的数据(视哪个子进程后执行到lockf函数)*/{printf(:can't read pipe\n"); /*读取失败,打印错误信息*/}else{printf(:%s\n",s); /*打印读取到的信息数据*/}exit(0); /*主进程退出*/}}实验数据 延迟5秒后显示child 1 process is sending message!再延迟5秒child 2 process is sending message!实验总结 Linux系统在os的发展商,最重要的贡献之一便是该系统首创了管道(pipe)。这也是Linux系统的一大特色。1、sleep(5);语句是延迟5秒以保证数据完全写入管道内。 2、因为他们都继承了父进程的所有。178