有名管道

本文详细介绍了Linux中有名管道(FIFO)的概念、创建、打开与关闭方法,以及如何利用mkfifo和unlink函数进行管道管理。通过实例展示了如何创建、读写以及删除有名管道,并探讨了FIFO的特殊行为如SIGPIPE信号和阻塞open调用。
有名管道(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;
}

 

 

 

 
复制去Google翻译 翻译结果
 

转载于:https://www.cnblogs.com/shichuan/p/4496167.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值