pipe建立
int fd[2]
pipe(fd);
pipe读写
写:write(fd[1],buf,size);
读:read(fd[0],buf,size);
size:要写入的字符长度
lockf(int files,int function,long size);
作用:用来锁定文件的某些段或者整个文件。
int files:
fd[0]:pipe出口,读操作
fd[1]:pipe入口,写操作
function:
0:解锁
1:锁定
size: 0:表示从当前位置到文件尾
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
int main()
{
int i,r,p1,p2,p3,fd[2];
char buf[50],s[50];
pipe(fd); //父进程建立管道
while((p1=fork())==-1);
if(p1==0) //子
{
lockf(fd[1],1,0); //加锁锁定写入端 fd[1]:写入 1:锁定 0:当前位置到文件尾
sprintf(buf,"messages from child processs p1!\n");
printf("child process p1!\n");
write(fd[1],buf,50); //将buf中的50个字符写入管道
sleep(5); //实现进程互斥
lockf(fd[1],0,0); //释放管道写入端 fd[1]:写入 0:解锁 0:从当前位置到文件尾
exit(0);
}
else
{
while((p2=fork())==-1);
if(p2==0)
{
lockf(fd[1],1,0); //加锁,锁定写入端
sprintf(buf,"message from child process p2!\n");
printf("child process p2!\n");
write(fd[1],buf,50); //将buf中的字符写入管道
sleep(5);
lockf(fd[1],0,0); //释放管道写入端
exit(0); //关闭p2
}
while((p3=fork())==-1);
if(p3==0)
{
lockf(fd[1],1,0);
sprintf(buf,"message from child p3!\n");
printf("child process p3!\n");
write(fd[1],buf,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
wait(0);
if(r==read(fd[0],s,50)==-1) //创建失败
printf("can't read pipe\n");
else printf("%s\n",s);
wait(0);
if(r==read(fd[0],s,50)==-1)
printf("can't read pipe\n");
else printf("%s\n",s);
wait(0);
if(r==read(fd[0],s,50)==-1)
printf("can't read pipe\n");
else printf("%s\n",s);
exit(0);
}
return 0;
}