FIFO有名管道特点:
持久稳定,是作为一个文件存在文件系统的;
FIFO可以让两个无关联的进程之间交换数据。
这里通过fifo1有名管道来实现两个窗口之间的交换数据,在readfifo下可以读取到writefifo写入的数据。 就像两个窗口之间的聊天效果。
步骤:
第一步:在linux下使用shell命令建立有名管道
方法: mkfifo [option] name
这里创建一个名为fifo1的有名管道文件 : mkfifo fifo1
第二步:
编写一个readfifo.c 和writefifo.c以及一个makefile文件
readfifo.c 代码如下:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int arg, char*args[])
{
int len = 0;
char buf[100];
memset(buf, 0, sizeof(buf));
int fd = open("fifo1", O_RDONLY);//以只读的方式打开fifo1
while ((len = read(fd, buf, sizeof(buf))) > 0)
//循环从fifo1里读取数据,知道fifo1被关闭
{
write(STDOUT_FILENO, buf, sizeof(buf));
memset(buf, 0, sizeof(buf));
}
close(fd);//关闭文件fifo1
return 0;
}
writefifo.c代码如下:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int arg, char*args[])
{
int fd = open("fifo1", O_WRONLY);//以只写的方式打开fifo1
char buf[100];
memset(buf, 0, sizeof(buf));
while (1)
{
read(STDIN_FILENO, buf, sizeof(buf));//循环等待用户输入数据
if (buf[0] == '0')//如果用户输入0,退出循环
break;
write(fd, buf, strlen(buf));//将用户从键盘输入的字符通过fifo1传送出去
memset(buf, 0, sizeof(buf));//每次使用完buf,都要将buf清零
}
close(fd);
return 0;
}
makefile代码如下:
.SUFFIXES: .c .o
CC=gcc
SRCS1=fifo.c
SRCS2=writefifo.c
OBJS1=$(SRCS1:.c=.o)
OBJS2=$(SRCS2:.c=.o)
EXEC1=readfifo
EXEC2=writefifo
all: $(OBJS1) $(OBJS2)
$(CC) -o $(EXEC1) $(OBJS1)
$(CC) -o $(EXEC2) $(OBJS2)
@echo '-------------ok--------------'
.c.o:
$(CC) -Wall -g -o $@ -c $<
clean:
rm -f $(OBJS)
rm -f core*