fifo:命名管道
fifo、pipe区别:
fifo的名字用于不同进程看到同一个文件
pipe通过父子进程之间的继承关系看到同一份资源,因此不需要名字
相关命令:创建命名管道:mkfifo fifoname
相关函数:
int mkfifo(const char *pathname, mode_t mode);
参数:pathname:路径,mode:权限
返回值:创建成功返回0
umask(0);// fifo文件的权限=mode&(~umask),因此要设置umask=0
if(mkfifo(MY_FIFO,0666)<0){
perror("make fifo");
return 1;
}
创建成功,权限为0666的myfifo文件
命名管道实现server、client通信
// 服务端
#include"comm.h"
int main(){
umask(0);// fifo文件的权限=mode&(~umask)
if(mkfifo(MY_FIFO,0666)<0){
perror("make fifo");
return 1;
}
int fd = open(MY_FIFO,O_RDONLY);
if(fd < 0){
perror("open");
return 2;
}
// 业务逻辑,可以进行对应的读
while(1){
char buf[64] = {0};
ssize_t s = read(fd,buf,sizeof(buf)-1);
if(s>0){
buf[s] = 0;
printf("client:%s\n",buf);
}else if(s == 0){
printf("client quit\n");
break;
}else{
perror("read");
break;
}
}
close(fd);
return 0;
}
// 客户端,不需要再创建fifo
#include "comm.h" // 两个程序有能看到同一个资源的能力了
#include<string.h>
int main(){
int fd = open(MY_FIFO,O_WRONLY);
if(fd<0){
perror("open");
return 1;
}
// 业务逻辑 写数据
while(1){
printf("请输入:");
fflush(stdout);
char buf[64] = {0};
// 先把数据从标准输入stdin拿到client进程内
ssize_t s = read(0,buf,sizeof(buf)-1);
if(s>0){
// 键盘输入的时> 候,\n也是输入字符的一部分
buf[s-1] = 0;// 设置s-1是为了去掉\n
printf("%s\n",buf);
// 拿到数据,传给服务端
write(fd,buf,strlen(buf));
}
}
close(fd);
return 0;
}
同时运行两个程序,可以实现client客户端发送信息,server服务端接收信息