VxWorks除了支持WindRiver自己的Pipe,在VxWorks7里,还支持Posix的Pipe
#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的一些基本特点
看一个例子 - 使用默认的阻塞模式
/*
* 版权所有 公众号 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
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()流程图