管道

无名管道

无名管道
只能用于亲缘关系的进程间通信(父子进程,兄弟进程)
管道通信是单工的,一端读,一端写(程序实现设计好)
数据自己读不能自己写
管道可以用于大于2个进程共享

无名管道的读写特性:
父子进程均有pfd[0]=3,pfd[1]=4;(前三个为标准输入输出,错误)
close(pfd[0]);close(pfd[1])
读管道:
管道中有数据,read返回实际读到的字节数

无名管道创建

  1. 头文件:#include <unistd.h>
  2. int pipe(int pfd[2]);
    1. 成功:0;失败:-1,设置errno
    2. pfd包含两个整形数组,用来保存文件描述符
    3. pfd[0]用于读管道;pfd[1]用于写管道

    有名管道

  3. 有名管道:

  4. 有名管道可以使非亲缘的两个进程互相通信
  5. 通过路径名来操作,在文件系统中可见,但内容存放在内存中
  6. 文件IO来操作有名管道
  7. 遵循先进先出规则
  8. 不支持leek操作
  9. 单工读写
  10. 有名管道其实是一个文件,这个文件只能用于两个进程间通信的桥梁,不存储任何数据内容

  11. 有名管道的创建

    #include <stdio.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #define N 64

    int main()
    {
        int fd;
        int n;
        char buf[N];
        if (mkfifo("pipe", 0666) == -1)  //判断管道文件是否存在
        {
            if (errno != EEXIST)    //如果文件存在,则什么也不执行,如果是其他错误,则退出
            {
                perror("mkfifo");
                return -1;
            }
        }
        if ((fd = open("pipe", O_WRONLY)) == -1) //以只写方式打开管道文件,默认追加到文件后面(队列)
        {
            perror("open pipe");
            return -1;
        }
        while (fgets(buf, N, stdin) != NULL)    
        {
            n = strlen(buf);
            if (write(fd, buf, n+1) == -1) //向管道里写数据
            {
                perror("write");
                return -1;
            }
        }

        close(fd);
        return 0;
    }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值