进程的管道通信
实验项目名称 实验辣:进程的管道通信
实验目的 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 <unistd.h>
#inlcude <signal.h>
#include <stdio.h>
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.C
3、#./6 | > 6out
4、6out为程序输出
实验内容 #include <stdio.h>
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函数)*/
751com.cn
else
{
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