程序间异步通信——其本质都只是将信息从A端到B端的传递,只要通信双方都做好发出信息和接收信息的准备就可以实现飞鸽传书
头文件 | #include |
#include |
|
原型 | int mkfifo(const char *pathname, mode_t mode) |
功能 | 创建有名管道 |
参数 | pathname: 有名管道文件的路径名 |
mode:管道文件访问权限 | |
返回值 | 成功:返回管道文件描述符 |
失败:-1 | |
备注 | FIFO文件的数据始终存储在内存中,关闭FIFO文件后,数据清空,故大小始终为0 |
创建有名管道的两种方法 | 在命令行创建:mkfifo -m [权限] [管道名] |
在程序中调用库函数:mkfifo(“[管道名]”, [权限]); |
要使用有名管道必须添加以下库文件,其他库文件酌情添加(总觉得好像在说调味料)
#include
#include
在程序中调用mkfifo函数:mkfifo(“[管道名]”, [权限]);
mkfifo("rw_fifo",0777);
跟我们平时打开文件的方法是一样的,这里我们使用可读写方式打开
fd=open("rw_fifo",O_RDWR);
fd决定了那一只鸽子去送信
wbuf决定了信的内容
20表示信的大小
write(fd,wbuf,20);
fd决定了那一只鸽子去送信
rbuf用来抄录fifo文件里面的内容
20表示表示要抄多少下来
read(fd,rbuf,20);
这里就相当简单了,普通的文件我普通地关
close(fd);
想要实现来回送信,我们就需要用到两只鸽子,那么我们就开始写吧!
#include
#include
#include
#include
#include
#include
char wbuf[20];
char rbuf[20];
wbuf = "hello.A";//定义字符串
fgets(wbuf,20,stdin);//从屏幕输入
read(fd_file,wbuf,20);//从文件中读取
mkfifo("1w2rfifo",0777);
mkfifo("1r2wfifo",0777);
int fd[2];
if( (fd[0]=open("1w2rfifo",O_RDWR)) <0)
{
perror("wfifo打开失败");
exit(1);
}
if( (fd[1]=open("1r2wfifo",O_RDWR)) <0)
{
perror("rfifo打开失败");
exit(1);
}
write(fd[0],wbuf,20);//将信放进去
read(fd[1],rbuf,20);//把信拿出来
while里面增设退出条件,尽可能地考虑通信双方是否能同时退出程序
while(*wbuf != 'q' || *rbuf != 'q'){//q为退出信息
/*代码实现*/
}
fputs(rbuf,stdout);//输出到屏幕
write(fd_file,rbuf,20);//输出到文件
printf(rbuf);//打印输出到屏幕
close(fd[0]);
close(fd[1]);
以下是程序的效果:
A端发送信息,B端接收,接着B端发信息,A端接收
当A端输入退出信息q时,B端收到了q,然后B端将退出信息q发送回去后,A接收到q的信息,两个程序同时退出。
文件底层I/O基本操作——东写西读南开北关中位移_莫韵乐的Linux英雄传
文件标准I/O基本操作——FX乐曲时代_莫韵乐的Linux英雄传