linux应用编程笔记(9)无名管道编程

摘要: 总结了Linux下进程通讯目的,通讯方式,IPC的概念,分析了管道和无名管道的使用方法,最后通过一个实例加深理解!


一、Linux进程通讯目的

    Linux是一个多进程系统,各个进程之间会存在通讯的问题,通讯的目的有以下几种:

    1.数据传输

    一个进程需要将数据发送给另一个进程。

    2.资源共享

    多个进程可能会共享同一块内存上的数据。

    3.通知事件

    一个进程需要向别的进程发送消息,告诉他们发生了什么事件。

    4.进程控制

    有些进程希望控制其他进程的执行状态,例如DEBUG进程,此时该进程希望可以拦截其他进程的所有操作,并时刻知道它的状态。

    其实说白了,上面的四个我认为都是一个道理,那就是进程之间的“数据传递”,无论是数据传输,资源共享,通知事件或者进程控制,他们之间都存在一个数据流的交互,只是模式不同,功能不同罢了。


二、IPC

    IPC的扩展名是:interprocess communication,是由unix进程间通信,基于system V进程间通信和posix进程间通信发展而来。其,POSIX(Portable Operating SystemInterface)表示可移植操作系统接口。电气和电子工程师协会IEEE最初开发 POSIX 标准,是为了提高UNIX 环境下应用程序的可移植性。许多其他的操作系统,例如windows也是支持posix的。


三、Linux进程间的通讯方式

    主要有以下七种:

    1.无名管道(pipe

    2.有名管道(FIFO

    3.消息队列(msg*

    4.共享内存(shm*)

    5.信号量(sem*)

    6.信号(signal

    7.套接字(socket


四、管道通信及无名管道

    一个进程在管道的写端写入数据,另一个进程在管道的读端读走数据,就像一根管道,一个人一边,写的人往里扔一个球,读的人在另一边拿走,读走了就没有了。

    管道包括无名管道和有名管道,无名管道只能用于父子进程之间的通信,有名管道可以用于同一系统中任意两个进程之间的通信。

    1.管道通讯是单向的,有固定的读端和写端。
    2.数据被进程从管道读出后,在管道中该数据就不存在了。
    3.当进程去读取空管道的时候,进程会阻塞
    4.当进程往满管道写入数据时,进程会阻塞
    5.管道容量为64KB(#define PIPE_BUFFERS 16
    include/linux/pipe_fs_i.h)

    6.在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件,我们可以使用read,write,close方式来进行访问操作。无名管道的读端被视作一个文件;无名管道的写端也被视作一个文件。


五、无名管道操作函数

1.创建管道

    函数原型:int pipe(int pipefd[2])

    函数作用:创建一个无名管道

    头文件:include <unistd.h>

    函数参数:pipefd[0]存放返回的管道读端的文件句柄,pipefd[1]存放返回的管道写端的文件句柄

    返回值:

       成功:返回管道两端的文件句柄存放在pipefd数组中,函数的返回0

       失败:函数返回-1,pipefd中不会有文件句柄    

 

2.关闭管道

    写端close(pipefd[1]),读端close(pipefd[0])

3.读管道

    read(pipefd[0],buf,count)

4.写管道

    write(pipefd[1],buf.count)

<span style="font-size:18px;">例程:mypipe.c
#include <stdio.h>
#include <unistd.h>
 
int main(void)
{
    pid_tpid=0;
    intpipefd[2];
    charbuf1[20]={"this is buf1"};
    charbuf2[20];
    /*创建管道*/
    if(pipe(pipefd)<0)
       {
           perror("creatpipe fault!\n");
           exit(1);
           }
    /*创建子进程*/
    pid=fork();
    /*写管道*/
    if(pid>0)
       {
           write(pipefd[1],buf1,20);
           wait();
           close(pipefd[1]);
           exit(0);
           }
    /*读管道*/
       else
           {
           read(pipefd[0],buf2,20);
           printf("%s\n",buf2);
           close(pipefd[0]);
           exit(0);
              }
    return0;
 }
运行结果为:
#this is buf1</span>

    这篇帖子就总结到这里,如有不正确的地方还请指出,大家共同进步!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值