有名管道是一个可以在文件系统中长期存在的、具有路径名的文件。用系统调用mknod( )建立。它克服无名管道使用上的局限性,可让更多的进程也能利用管道进行通信。因而其它进程可以知道它的存在,并能利用路径名来访问该文件。对有名管道的访问方式与访问其他文件一样,需先用open( )打开。
无名管道是一个临时文件,利用pipe()函数建立起来的无名文件。只有该系统调用所返回的文件描述符来标识该文件。发送进程利用文件系统调用write()来送入管道,结婚搜进程则使用系统调用read()从管道读出消息。这里,管道俺FIFO方式传送消息,且只能单向传送消息。
三个子进程和父进程的管道通信。
编写一个程序,建立一个管道。同时,父进程生成子进程P1,P2,P3,这三个子进程分别向管道中写入消息(消息由键盘输入),父进程将消息读出。
<code>
include<unistd.h>
#include<signal.h>
#include<stdio.h>
main()
{
int fd[2],p1,p2,p3;
char outpipe[100],inpipe[100];
pipe(fd); //创建管道
while((p1=fork())==-1); //创建子进程
if(p1==0)
{
lockf(fd[1],1,0); //锁定管道写入端
sprintf(outpipe,"child1 is send message!"); //定义发送缓冲区
write(fd[1],outpipe,50); //写入管道
sleep(1);
lockf(fd[1],0,0); //释放管道
exit(0); //子进程终止
}
else
{
while((p2=fork())==-1);
if(p2==0)
{
lockf(fd[1],1,0); //互斥
sprintf(outpipe,"child2 is send message!");
write(fd[1],outpipe,50);
sleep(1);
lockf(fd[1],0,0);
exit(0);
}
else
{
while((p3=fork())==-1);
if(p3==0)
{
lockf(fd[1],1,0);
sprintf(outpipe,"child3 is send message!");
write(fd[1],outpipe,50);
sleep(1);
lockf(fd[1],0,0);
exit(0);
}
else
{
wait(0); //同步 等待子进程终止
read(fd[0],inpipe,50);
printf("%s/n",inpipe);
wait(0); //同步 等待子进程终止
read(fd[0],inpipe,50);
printf("%s/n",inpipe);
wait(0); //同步 等待子进程终止
read(fd[0],inpipe,50);
printf("%s/n",inpipe);
exit(0);
}
}
}
}
运行结果: