有名管道

有名管道(FIFO)。
有名管道是持久稳定的。
它们存在于文件系统中。
FIFO比无名管道作用更大,因为它们能让无关联的进程之间交换数据。
一个shell命令可以建立有名管道
mkfifo [option] name
mkfifo创建一个名为name的有名管道
 
 
mkfifo fifo1。
  –创建一个有名管道fifo1。
cat < fifo1。
  –通过cat命令从fifo1中读取数据。
ls > fifo1。
  –将ls命令输出的结果写入fifo1中
 
创建fifo。

int mkfifo(const char *pathname, mode_t mode)

函数执行成功返回0,否则返回-1,并设置变量errno。
 
 
mkfifo函数例子。
int main(int arg, char *args[])
{
    mkfifo("fifo1", 0666);
    return 0;
}

 

删除fifo。

int unlink(const char *pathname);

函数执行成功返回0,否则返回-1,并设置变量errno。
 
 
unlink函数例子。
int main(int arg, char * args[])
{
    int i = unlink("fifo1");
    if (i == -1)
    {
        printf(strerror(errno));
    }
    return 0;
}

 

打开和关闭FIFO。

int open(const char *pathname, int flags);

int close(int fd);

Linux的一切都是文件这一抽象概念的优势,打开和关系FIFO和打开关闭一个普通文件操作是一样的。
 
 
 
FIFO的两端使用前都必须要打开
在读写FIFO时,如果FIFO以O_NONBLOCK和O_RDONLY标志打开,那么调用马上就会返回
如果在读写FIFO时,如果FIFO以O_NONBLOCK和O_WRONLY标志打开,在FIFO还没有为读出数据打开时,调用open会返回一个错误。
如果open中没有指定O_NONBLOCK,O_RDONLY将阻塞open调用,一直到另一个进程为写入数据打开FIFO为止。相同的,O_WRONLY也导致阻塞一直到为读出数据打开FIFO为止。
 
 
向一个没有为读出数据打开的FIFO写入数据会导致SIGPIPE信号,并设置errno。
在最后一个写数据的进程关闭FIFO以后,读数据的进程能在它下一次的读操作中监测到EOF标志
 
 
读FIFO例子
int main(int arg, char * args[])
{
    int len = 0;
    char buf[PIPE_BUF];
    memset(buf, 0, sizeof(buf));
    int fd = open("fifo1", O_RDONLY);
    while ((len = read(fd, buf, sizeof(buf))) > 0)
    {
        printf("%s\n", buf);
    }
    close(fd);
    return 0;
}
 
写FIFO例子
int main(int arg, char * args[])
{
    int len = 0;
    char buf[PIPE_BUF];
    memset(buf, 0, sizeof(buf));
    int fd = open("fifo1", O_WRONLY);
    while(1)
    {
        scanf("%s", buf);
        if (buf[0] == '0')
            break;
        write(fd, buf, sizeof(buf));
    }
    close(fd);
    return 0;
}

 

 

 

 
posted @ 2015-05-12 00:28  张仕传  阅读(666)  评论(0编辑  收藏  举报