linux 13 管道

目录

1、管道

2、有名管道

3、无名管道

4、、无论是有名还是无名,写入管道的数据都写在内存中

5、管道的实现

6、有名管道和无名管道的区别

7、写入管道的数据在哪里


linux基本命令

类型:d目录  -普通  p管道

权限:r w x  chomd

静态库libxx.a  共享库libxx.so

直接拷贝       使用时拷贝     -L路径  l库名

进程 复制进程fork   exec替换    信号   SIGINT  kill    9SIGCHLD

1、管道

管道可以用来在两个进程之间传递数据

ps-ef|grep “bash”

其中|就是管道。将ps命令的结果写入管道,然后grep再从管道中读出数据进行过滤

当管道为空时,读操作会阻塞,当管道写满后,写操作就会阻塞住。

2、有名管道

有名管道可以在任意两个进程直接通信

有名管道的创建:

命令创建 mkfifo FIFO

系统调用创建

int mkfifo(const char*filename,mode_t mode)//filename是管道名,mode是创建的文件的访问权限

成功返回0,失败返回-1

int main(){

    //判断文件是否存在    int ret = open("fifo1", O_RDONLY);

    if (ret == -1) {

        printf("管道不存在,创建管道\n");

        ret = mkfifo("fifo1", 0664);//创建管道

        if (ret == -1) {

            perror("mkfifo");

            exit(0);

        }

    }

    return 0;}

3、无名管道

无名管道主要应用于父子进程之间的通信

pipe()//成功返回0,失败返回-1

fd[0]是管道读端的描述符

fd[1]是管道写端的描述符

int main()

{

int fd[2];

int res=pipe(fd);//接收返回值,查看管道是否创建成功

asssert(res!=-1)//判断管道创建成功

pid_t pid=fork();//判断子进程是否创建成功

assert(pid!=-1)

if(pid=0)//表示当前在子进程中

{

char buff[128]={0};

read(fd[0],buff,127);//从管道向buff读入数据

printf(“%s”,buff);

}

else

{

write(fd[1],”hello”,5)//向管道读入数据

}

close(fd[0]);

close(fd[1]);

exit(0);

}

4、、无论是有名还是无名,写入管道的数据都写在内存中

管道是一种半双工通信方式(通信方式有单工、半双工通信、全双工通信)

单工通信:A只能发出B只能接收

半双工通信:A发送B接收或者A接收B发送

全双工通信:A发送并接受,B发送并接收

5、管道的实现

管道是一个固定大小的缓冲区 。在Linux 中,该缓冲区的 大小为1 页,即4KB,使得它的大小不像文件那样不加检验地增长。使用单个固定缓冲区也 会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将 默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。

从管道读数据是一个一次性操作,数据一旦被读走,那么他就从管道中被抛弃了,释放空间以便写入更多的数据

  1. 进程间通信(IPC):管道  信号量 共享内存 消息队列 套接字
  2. mkfifo FIFO

管道的大小永远为0,写到管道中的信息直接写到内存中了

如果在磁盘上性能比较低,临时通信时使用,至少一个读一个写

open write read close

对于管道的打开方式只有读或者只写

open(“文件名”,O_WRONLY)o-wronly

open("fifo",O_RDONLY);0_rdonly

如果管道文件只有读或者只有写,open的时候就会堵塞住,无法继续允许

管道的一段关闭,另外一端也会停止

写关闭,读也会关闭,返回值为0

6、有名管道和无名管道的区别

无名管道是在父子进程之间进行的,有名管道在任意两个管道之间都可以进行

7、写入管道的数据在哪里

内存

划分成一个一个字节头指针和尾指针之间的大小就是管道的大小,当头指针和尾指针指向同一个内存,表示数据被读空,读被堵塞,如果内存被写满了,那么写堵塞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值