进程通信篇——1、无名管道

无名管道特点

1)只能用于具有亲缘关系的进程之间的通信
 2)半双工的通信模式,具有固定的读端和写端 
 3)管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数
 4)向无名管道中写数据,一旦管道写满,则写操作阻塞,管道的大小为64K
 5)当管道中无数据,执行读操作,读操作阻塞
 6)对于无名管道的操作,属于一次性操作,
    如果执行读操作,被读取的数据,将会从管道中清除
 7)向无名管道中写数据,一旦管道写满,则写操作阻塞,当
    管道中有4k以上的空间时,可以继续写入,写入4k整倍数
 8)关闭读端,管道损坏之后,向管道中写数据,进程被终止(SIGPIPE)  
 9)如果管道中有数据,关闭写端,执行读操作,可以读到数据
    之后再进行读操作,读操作不阻塞

 

创建管道的函数原型:int pipe(int pipefd[2]);
              功能:创建一个无名管道
              参数:pipefd  数组,保存管道的文件描述符
                           fd[0] 读端
                           fd[1] 写端

例程:

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

#define N 64
int main(int argc, const char *argv[])
{
    pid_t pid;
    int fd[2];
    char buf[N] = "";
    if(pipe(fd) < 0){        /*创建无名管道*/
        perror("pipe error");
        return -1;
    }
    pid = fork();    /*创建两个线程*/
    if(pid < 0){
        perror("fork error");
        return -1;
    }
    else if(pid == 0){    /*子进程 作为通信管道的写端*/
        while(1){
            fgets(buf, N, stdin);        /*键盘输入数据*/
            buf[strlen(buf) - 1] = '\0';
            write(fd[1], buf, strlen(buf));        /*写入管道*/
            if(strncmp(buf, "quit", 4) == 0){    /*一定模式退出,写端退出,读端能够正常读取,直到管道数据读取完毕*/
                break;
            }
        }
    }
    else{    /*父进程 作为通信管道的读端*/
        while(1){
            read(fd[0], buf, N);        /*读取管道中的数据*/
            if(strncmp(buf, "quit", 4) == 0){
                break;
            }

            printf("read:%s\n", buf);
        }
    }
    return 0;
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值