管道通信实验解析:无名与有名管道示例

需积分: 0 0 下载量 133 浏览量 更新于2024-08-04 收藏 311KB DOCX 举报
下程序: "实验五-杨添宝1,涉及管道通信的实践与解析" 在实验五中,我们探讨了两种类型的管道通信——无名管道和有名管道,它们都是进程间通信(IPC, Inter-Process Communication)的一种方式。下面将详细解释这两种管道的工作原理、代码实现以及程序执行过程。 1. 无名管道(Unnamed Pipe) 无名管道由`pipe()`函数创建,它返回一个文件描述符数组`filedes`,其中`filedes[0]`用于读取,`filedes[1]`用于写入。在给出的程序中: ```c if(pipe(filedes)<0) err_quit("pipe error"); ``` 这里创建了一个无名管道,并检查是否有错误。 ```c if(fork()>0) { char s[]="hello!\n"; close(filedes[0]); write(filedes[1], s, sizeof(s)); close(filedes[1]); } else { close(filedes[1]); read(filedes[0], buffer, 80); printf("%s", buffer); close(filedes[0]); } ``` 这段代码通过`fork()`创建子进程。在父进程中,关闭读端`filedes[0]`,然后向写端`filedes[1]`写入字符串"hello!\n",最后关闭写端。在子进程中,关闭写端,从读端读取数据到缓冲区`buffer`,并打印出来。 2. 有名管道(Named Pipe, FIFO) 有名管道由`mkfifo()`函数创建,它需要一个路径名作为参数,如"_FIFO"。在给出的程序中: ```c unlink("FIFO"); mkfifo("FIFO", 0666); ``` 这里先删除可能存在的"FIFO",然后创建一个新的有名管道,权限设置为0666,意味着所有用户都有读写权限。 ```c if(fork()>0) { char s[]="hello!\n"; fd=open("FIFO", O_WRONLY); write(fd, s, sizeof(s)); close(fd); } else { fd=open("FIFO", O_RDONLY); read(fd, buffer, 80); printf("%s", buffer); close(fd); } ``` 与无名管道类似,但在这里,进程通过有名管道的路径名("FIFO")进行读写操作。父进程打开管道以写入,写入后关闭;子进程打开以读取,读取后关闭。 这两个实验展示了管道通信的基本用法。无名管道只在相关进程之间有效,而有名管道可以作为进程间的共享通道,即使进程不在同一个会话或组中。在这个例子中,两个程序都展示了数据如何从父进程传递到子进程,或者从一个进程写入管道,由另一个进程读取。这种通信方式对于简单的进程间数据交换非常有效。