管道

匿名管道:

只能⽤用于具有共同祖先的进程(具有亲缘关系的进程)之间进⾏行通信;

通常,⼀一个管道由⼀一个进程 创建,然后该进程调⽤用fork,此后⽗父、⼦子进程之间就可应⽤用该管道。

管道提供流式服务 ⼀一般⽽而⾔言,进程退出,管道释放,所以管道的⽣生命周期随进程 ⼀一般⽽而⾔言,内核会对管道操作进⾏行同步与互斥 管道是半双⼯工的,数据只能向⼀一个⽅方向流动;

需要双⽅方通信时,需要建⽴立起两个管道 

匿名管道实现从键盘读取写入管道,读取数据输出到屏幕。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main (void)
{
        int fds [2];
        char buf[100];
        int len;

        if (pipe (fds) == -1)
                perror ("make pipe"),exit(1);
        while ( fgets (buf, 100,stdin))
        {
                len = strlen (buf);
                if (write (fds[1], buf, len) != len)
                {       perror ("write to pipe");
                        break;
                }
                memset (buf, 0x00, sizeof (buf));
                if ((len = read(fds[0], buf, 100)) == -1)
                {
                        perror ("read from pipe");
                        break;
                }
                if (write (1, buf, len) != len)
                {       perror ("write to stdout");
                        break;
                }
        }

}

运行结果:

 

 

命名管道:

管道应⽤用的⼀一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。 如果我们想在不相关的进程之间交换数据,可以使⽤用FIFO⽂文件来做这项⼯工作,它经常被称为命名 管道。 命名管道是⼀一种特殊类型的⽂文件

命名管道的创建:

命名管道可以从命令⾏行上创建,命令⾏行⽅方法是使⽤用下⾯面这个命令:
$ mkfifo filename
命名管道也可以从程序⾥里创建,相关函数有:
int mkfifo(const char *filename,mode_t mode);
创建命名管道:
int main(int argc, char *argv[]) {    mkfifo("p2", 0644);    return 0; }

 

 

命名管道和匿名管道的区别:

        匿名管道由pipe函数创建并打开。 命名管道由mkfifo函数创建,打开⽤用open FIFO(命名管道)与pipe(匿名管道)之间唯⼀一的区别在它们创建与打开的⽅方式不同,⼀一但这些 ⼯工作完成之后,它们具有相同的语义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值