前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POSIX之Pipe

POSIX之Pipe

作者头像
Taishan3721
发布2022-06-30 19:02:11
8720
发布2022-06-30 19:02:11
举报
文章被收录于专栏:这里只有VxWorks

VxWorks除了支持WindRiver自己的Pipe,在VxWorks7里,还支持Posix的Pipe

代码语言:javascript
复制
#define _POSIX_PIPE_BUF  512

int pipe
    (
    int fd[2]
    );
int pipe2
    (
    int fd[2],
    int flags  /* O_NONBLOCK|O_CLOEXEC */
    );

pipe()会申请一块Ring Buffer,这个Buffer有一个读端、一个写端,分别存入入参的fd中。然后通过Basic IO的read(fd(0))和write(fd(1))就可以对Pipe进行读写了

Posix Pipe的一些基本特点

  • 单向通信,fd(1)只支持write,fd(0)只支持read
  • 严格遵循FIFO,不支持lseek()
  • Buffer的Size由参数PX_PIPE_BUFFER_SIZE指定,但最小值为_POSIX_PIPE_BUF
  • 默认为阻塞模式,可使用fcntl()的F_SETFL来指定或使用pipe2()的第二个参数

看一个例子 - 使用默认的阻塞模式

代码语言:javascript
复制
/*
 * 版权所有  公众号  VxWorks567
 *
 * INCLUDE_POSIX_PIPES
 */
#include <fcntl.h>    /* fcntl() */
#include <stdio.h>    /* printf() */
#include <ioLib.h>    /* open() */
#include <string.h>   /* strlen() */
#include <tasklib.h>  /* taskSpawn() */

#define BUF_TEXT "hello world"

static int pipeid[2];

static void task1()
{
    int ret;

    sleep(1);

    printf("PIPE: write begin\n");
    ret = write(pipeid[1], BUF_TEXT, strlen(BUF_TEXT));
    printf("PIPE: write %s, %d bytes into pipe %d\n", BUF_TEXT, ret, pipeid[1]);

    close(pipeid[1]);
    }

static void task2()
{
    char buf[_POSIX_PIPE_BUF] = "";
    int ret;

    printf("PIPE: read begin\n");
    ret = read(pipeid[0], buf, _POSIX_PIPE_BUF);
    printf("PIPE: read %s, %d bytes from pipe %d\n", buf, ret, pipeid[0]);

    close(pipeid[0]);
    }

int testPosixPipe()
{
    sleep(1);

    if(pipe(pipeid) != 0)
        {
        printf("PIPE: create pipe failed\n");
        return 0;
        }

    printf("PIPE: create pipe[0] = %d, pipe[1] = %d\n", pipeid[0], pipeid[1]);

    taskSpawn("t1", 200, 0, 0x2000, (FUNCPTR)task1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0);
    taskSpawn("t2", 200, 0, 0x2000, (FUNCPTR)task2, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0);
    return 0;
    }

改为非阻塞模式,read()立即返回-1

代码语言:javascript
复制
int testPosixPipe()
    {
    sleep(1);

    if(pipe(pipeid) != 0)
        {
        printf("PIPE: create pipe failed\n");
        return 0;
        }

    printf("PIPE: create pipe[0] = %d, pipe[1] = %d\n", pipeid[0], pipeid[1]);

    fcntl(pipeid[0], F_SETFL, O_NONBLOCK);
    printf("PIPE: F_GETFL = %#x\n",
            fcntl(pipeid[0], F_GETFL));
    ......

read()流程图

write()流程图

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档