Linux 学习笔记7 文件操作——管道文件

Linux 学习笔记7 文件操作——管道文件

创建管道文件命令:mkfifo

首先需要了解内核态和用户态的概念:
内核态和用户态

管道原理:
假设有两个进程,进程1为read进程,进程2为write进程,在内核态中都存在着一个buf缓冲区

管道原理

两个进程之间具有独立的进程地址空间
两个进程之间通信:
打开一个文件(或者是一个管道文件),内核会开辟一段缓冲区, 此时内核会进行检查,发现是管道文件而且是read,就会进行阻塞,让read进程进入Sleep状态;打开write端时,就会对read端进行唤醒。此时,两个进程的缓冲区实际在内存中是一块内核区域的缓冲区。

利用管道实现即时聊天:

#include "func.h"
//先读再写
int main(int argc,char *argv[])
{
    ARGS_CHECK(argc,3);                                                                                       
    int fdr=open(argv[1],O_RDONLY);//以读的方式打开第一条管道
    if(-1==fdr)
    {   
        perror("open");
        return -1; 
    }   
    int fdw=open(argv[2],O_WRONLY);//以写的方式打开第二条管道
    ERROR_CHECK(fdw,-1,"open");
    printf("I am mark2\n");
    char buf[128]={0};
    int ret;
    while(1)
    {   
        ret=read(fdr,buf,sizeof(buf));
        ERROR_CHECK(ret,-1,"read");
        printf("%s\n",buf);
        memset(buf,0,sizeof(buf));
        ret=read(STDIN_FILENO,buf,sizeof(buf));
        ret=write(fdw,buf,strlen(buf)-1);
    }   
    return 0;
}

#include "func.h"
//先写再读
int main(int argc,char *argv[])
{
    ARGS_CHECK(argc,3);
    int fdw=open(argv[1],O_WRONLY);//以写的方式打开第一条管道
    if(-1==fdw)
    {   
        perror("open");
        return -1; 
    }   
    int fdr=open(argv[2],O_RDONLY);//以读的方式打开第二条管道
    printf("I am mark1\n");//测试死锁,如果本句没打印即死锁
    char buf[128]={0};
    int ret;
    while(1)
    {   
        ret=read(STDIN_FILENO,buf,sizeof(buf));
        ERROR_CHECK(ret,-1,"read");
        ret=write(fdw,buf,strlen(buf)-1);
        ERROR_CHECK(ret,-1,"write");
        memset(buf,0,sizeof(buf));
        ret=read(fdr,buf,sizeof(buf));                                                                        
        printf("%s\n",buf);
    }   
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值