mkfifo,open,write,read

FIFO也叫作命名管道,因此两者本质上还是很相像的。

FIFO不同于pipe的地方:
1)FIFO可以看作高级的管道。它突破了pipe的限制(只能用于同源进程之间的通信)可以给任意进程之间建立通信连接;
2)FIFO是一个实际存在于磁盘中的文件;而pipe是由进程创建的,依赖于进程的存活期。

可以调用mkfifo函数来创建一个FIFO文件。

    #include <sys/stat.h>

    int mkfifo(const char* pathname, mode_t mode);


因为它本质上是一个文件,所以进程用open函数来打开一个FIFO,并在打开时指定文件操作模式(只读,只写还是读写)。之后用read(write)函数来读(写)FIFO

当一个进程以只写方式打开FIFO文件,另一个进程以只读方式打开同一个FIFO文件,这样就建立了两个进程之间的通信管道。




实际工作时,pipe和FIFO基本相同的。下面是两者相同的性质:

1)当读一个写端已经被关闭的pipe(或者是读一个没有为写打开的进程的FIFO)时,在所有数据都被读取后,read返回0,以指示到达了文件结束处
2)当写一个读端已经被关闭的pipe(或者是写一个没有为读打开的进程的FIFO)时,write返回-1,并将errno设置为EPIPE

3)在写pipe或者FIFO时,常量PIPE_BUF规定了内核中管道缓冲区的大小如果多个进程同时写一个管道(或者FIFO),要保证写的字节数不大于PIPE_BUF,这样多个写进程的数据不会相互穿插而造成混乱

4)  open使用O_NONBLOCK 旗标时,打开FIFO 文件来读取的操作会立刻返回,但是若还没有其他进程打开FIFO 文件来读取,则写入的操作会返回ENXIO 错误代码。没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操作会等到其他进程打开FIFO文件来写入才正常返回。同样地,打开FIFO文件来写入的操作会等到其他进程打开FIFO 文件来读取后才正常返回

void roc_init()
{
    if (mkfifo(PIPE_NAME, 0666)  < 0) {
        AEIDEBUGERROR("mkfifo %s fail, errno=0x%x\n", AEICMDPIPE_NAME, errno);
    }

    PipeReadFd = open(PIPE_NAME, O_RDONLY|O_NONBLOCK);
    if (PipeReadFd == -1) {
        AEIDEBUGERROR("Open m_CmdPipeReadFd fail\n");
    }

    PipeWriteFd = open(PIPE_NAME, O_WRONLY|O_NONBLOCK);
    if (PipeWriteFd == -1) {
        AEIDEBUGERROR("Open m_CmdPipeWriteFd fail\n");
    }
}

 

void CmdSend(char *cmdstr)
{
    int fd;

    fd = open(PIPE_NAME, O_WRONLY);

    if (fd > 0) {
        write(fd, cmdstr, strlen(cmdstr));
        close(fd);
    }
}

 

void cmdread(char *p_cmdstr)

{

   if (select)

   read()

   //解析

}

 

你可能感兴趣的:(mkfifo,open,write,read)