linux下进程间的通信——有名管道fifo学习笔记

FIFO有名管道特点:
持久稳定,是作为一个文件存在文件系统的;
FIFO可以让两个无关联的进程之间交换数据。

这里通过fifo1有名管道来实现两个窗口之间的交换数据,在readfifo下可以读取到writefifo写入的数据。 就像两个窗口之间的聊天效果。

步骤:
第一步:在linux下使用shell命令建立有名管道
方法: mkfifo [option] name
这里创建一个名为fifo1的有名管道文件 : mkfifo fifo1
第二步:
编写一个readfifo.c 和writefifo.c以及一个makefile文件

readfifo.c 代码如下:

#include 
#include 
#include
#include 
#include 
#include 
#include 
#include 

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 
#include 
#include
#include 
#include 
#include 
#include 
#include 

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*

你可能感兴趣的:(linux进程间通信)