linux进程通信--有名管道(FIFO)(含实例代码)
2008-03-24 09:19
946 查看
有名管道(FIFO):与管道不同,可以在没有亲缘关系的多个进程间通信。
创建完FIFO,读或写FIFO的进程首先要有打开FIFO的操作:
读FIFO的进程以阻塞方式读打开,如果没有其它进程写则打开操作阻塞;
写FIFO的进程以阻塞方式写打开,没有其它进程读则打开操作阻塞。
某进程以阻塞方式读FIFO,如果FIFO没有数据或是有数据但其它进程在读,则发生阻塞。
某进程以阻塞方式写FIFO,与写管道是一样的,写入字节数小于PIPE_BUF是原子操作,
写操作在管道缓冲区没有及时读走数据时发生阻塞。
主要函数:
int mkfifo (const char *pathname, mode_t mode);
附代码
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include<stdlib.h>
#include<stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#define FIFO "fifo"
main()
...{
pid_t pid;
int fd_r,fd_w;
int num_r,num_w;
int len = 40;
char buf_r[len];
char buf_w[len];
//也可以在shell下用mkfifo创建fifo
if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
...{
printf("create fifo fail! ");
return;
}
if((pid=fork())==0)
...{
sleep(1);
printf("进程(%d):准备打开fifo ",getpid());
fd_r = open(FIFO,O_RDONLY,0);
if(fd_r==-1)//以阻塞方式读打开,没有其它进程写则打开操作阻塞
...{
printf("进程(%d):打开fifo失败... ",getpid());
return;
};
printf("进程(%d):打开fifo成功. ",getpid());
while(1)
...{
num_r = read(fd_r,buf_r,sizeof(buf_r));
printf( "读字节数:%d ",num_r);
sleep(1);
//这里将验证写阻塞,写进程不休眠,很快就把管道写满,再写的时候就阻塞了
}
}
else if(pid>0)
...{
printf("进程(%d):准备打开fifo ",getpid());
//if(open(FIFO,O_WRONLY|O_NONBLOCK,0)==-1)
fd_w = open(FIFO,O_WRONLY,0);
if(fd_w ==-1)//以阻塞方式写打开,没有其它进程读则打开操作阻塞
...{
printf("进程(%d):打开fifo失败... ",getpid());
return;
}
printf("进程(%d):打开fifo成功. ",getpid());
while(1)
...{
num_w = write(fd_w,buf_w,sizeof(buf_w));
printf( "写字节数:%d ",num_w);
}
}
}
创建完FIFO,读或写FIFO的进程首先要有打开FIFO的操作:
读FIFO的进程以阻塞方式读打开,如果没有其它进程写则打开操作阻塞;
写FIFO的进程以阻塞方式写打开,没有其它进程读则打开操作阻塞。
某进程以阻塞方式读FIFO,如果FIFO没有数据或是有数据但其它进程在读,则发生阻塞。
某进程以阻塞方式写FIFO,与写管道是一样的,写入字节数小于PIPE_BUF是原子操作,
写操作在管道缓冲区没有及时读走数据时发生阻塞。
主要函数:
int mkfifo (const char *pathname, mode_t mode);
附代码
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include<stdlib.h>
#include<stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#define FIFO "fifo"
main()
...{
pid_t pid;
int fd_r,fd_w;
int num_r,num_w;
int len = 40;
char buf_r[len];
char buf_w[len];
//也可以在shell下用mkfifo创建fifo
if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
...{
printf("create fifo fail! ");
return;
}
if((pid=fork())==0)
...{
sleep(1);
printf("进程(%d):准备打开fifo ",getpid());
fd_r = open(FIFO,O_RDONLY,0);
if(fd_r==-1)//以阻塞方式读打开,没有其它进程写则打开操作阻塞
...{
printf("进程(%d):打开fifo失败... ",getpid());
return;
};
printf("进程(%d):打开fifo成功. ",getpid());
while(1)
...{
num_r = read(fd_r,buf_r,sizeof(buf_r));
printf( "读字节数:%d ",num_r);
sleep(1);
//这里将验证写阻塞,写进程不休眠,很快就把管道写满,再写的时候就阻塞了
}
}
else if(pid>0)
...{
printf("进程(%d):准备打开fifo ",getpid());
//if(open(FIFO,O_WRONLY|O_NONBLOCK,0)==-1)
fd_w = open(FIFO,O_WRONLY,0);
if(fd_w ==-1)//以阻塞方式写打开,没有其它进程读则打开操作阻塞
...{
printf("进程(%d):打开fifo失败... ",getpid());
return;
}
printf("进程(%d):打开fifo成功. ",getpid());
while(1)
...{
num_w = write(fd_w,buf_w,sizeof(buf_w));
printf( "写字节数:%d ",num_w);
}
}
}
相关文章推荐
- Linux进程间的通信——有名管道fifo与守护进程deamon
- linux进程通信----FIFO(有名管道)
- linux进程通信--管道(pipe)(含实例代码)
- linux下进程间的通信——有名管道fifo学习笔记
- (FIFO)有名管道在无亲缘进程间的通信
- 【编撰】linux IPC 002 - 匿名管道PIPE和有名管道FIFO的概念和实例,以及应用比较
- linux进程间管道通信pipe与fifo
- linux进程通信-有名管道
- linux 进程编程:有名管道fifo
- 【Linux进程通信】管道,FIFO
- 进程通信-有名管道FIFO
- 服务器serverbuffergcc数据结构Linux进程通信:命名管道FIFO小结
- linux中的进程通信-信号量和有名管道
- Linux进程通信之管道和FIFO
- Linux 进程通信(有名管道)
- Linux进程通信:命名管道FIFO小结
- Linux下进程的通信方式: 有名管道(命名管道)
- Linux进程通信之管道和FIFO
- Linux c==进程通信--有名管道(4)
- Linux进程通信 有名管道实现守护进程