原创 进程间无名管道通信

2015-3-7 16:30 278 0 分类: MCU/ 嵌入式 文集: Linux应用程序开发学习
进程间通讯:Linux作为一个多进程的操作系统,进程和进程之间是否也需要通讯呢?答案是必须需要通讯。那么,通讯的目的是什么呢?
  1. 数据传输:一个进程需要将数据发送给另一个进程
  2. 资源共享:多个进程之间共享同样的资源
  3. 通知事件:一个进程需要向另一个/组进程发送消息,通知它们发生了某事件
  4. 进程控制:有些进程希望完全能够控制另一个进程的执行(如debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道他的改变。
进程间通讯的发展:Linux进程间通讯(IPC:interprocess communication )由以下几部分发展而来:
  1. UNIX进程间通信
  2. 基于System V进程间通信
  3. posix进程间通信
posix(portable operating system interface)表示可移植操作系统接口。电气和电子工程师协会IEEE最初开发posix标准,是为了提高UNIX环境下应用程序的可移植性。然而,posix并不局限于UNIX,许多其他的操作系统,liruwindows都支持posix标准。
 
Linux进程间通讯的主要方式有:
  1. 无名管道(pipe)
  2. 有名管道(FIFO)
  3. 信号(signal)
  4. 消息队列
  5. 共享内存
  6. 信号量
  7. 套接字(socket)
管道通信:一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据。管道包括无名管道和有名管道两种,前者只能用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程之间的通信。
 
scksqfao23ifjbedthpqdkplg6_3edf8c9a2d34f5883c808761011a1b061425716371.1783.jpg?76912015-03-07%2016:19:31
管道通信---特点:
  1. 管道通讯是单向的,有固定的读端和写端。
  2. 数据被进程从管道读出后,在管道中该数据就不存在了。
  3. 当进程去读取空管道的时候,进程会阻塞。
  4. 当进程往满管道写入数据时,进程会阻塞。
  5. 管道容量为64kb(#define PIPE_BUFFERS 16 include/linux/pipe_fs_i.h)
无名管道:在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件。无名管道的读端被视为一个文件;无名管道的写端也被视为一个文件。
scksqfao23ifjbedthpqdkplg6_dc64f7d6ef0621571f3e986771a52f541425716409.8836.jpg?67282015-03-07%2016:20:09
 

5.1 创建无名管道

5.1.1 函数名     pipe
5.1.2 函数原形     int pipe(int pipefd[2]);
5.1.3 函数功能     创建进程间通信的无名管道
5.1.4 所属头文件    
5.1.5 返回值     成功:返回0     失败:返回-1
5.1.6 参数说明    pipefd[0]:读端fd     pipefd[1]:写端fd 
 
在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件。因此可以使用read,write,close等函数来访问无名管道。
 
小实验:无名管道通讯中,从子进程写数据,父进程中读数据。
 
#include
#include
int main()
{
     pid_t pd;
     int pipefd[2];
     char buf[15];
     pipe(pipefd);
     pd = fork();
     if(pd>0)
     {
          wait(NULL);
          read(pipefd[0], buf, 12);
          printf("%s\n", buf);
          printf("This is father process!\n");
          close(pipefd[0]);
          exit(0);
     }
     else
     {
          write(pipefd[1], "Hello Pipe!", 12);
          printf("This is child process!\n");
          close(pipefd[1]);
          exit(0);
     }
     return 0;
}
广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
潇洒哥 2015-07-08 16:01
位操作符的使用技巧
在C语言编程中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效...
潇洒哥 2015-04-04 17:39
finish shell分析之底层usart
rt_thread的finsh shell系统不愧是调试的一项利器,它可以除了完成一般shell的功能外,甚至还可以自定义命令。这个对功能单一的嵌入式系统来说是十分可贵的。在此我并不想对finsh...
潇洒哥 2015-04-01 21:29
__main() 和 main()
因为我们通常在BOOTLOADER中都已做好了比较细致的初始化工作,包括代码的搬运,所以我们最好别再调用库函数__main(),因为__main()作为ADS集成好的库函数,会对系统进行初始化设置...
潇洒哥 2015-03-26 22:54
RT-Thread学习之scons篇--解析rtconfig.py文件
rtconfig.py文件,主要用于指定编译器以及安装路径。除此之外,该文件中定义了大量的变量,这些变量包括编译选项,汇编选项,链接选项。   import os # toolchain...
潇洒哥 2015-03-26 22:53
RT-Thread学习之scons篇--SConsruct脚本文件解析
       scons的构建文件名称是统一的都称为SConstruct。其是scons所接受的编译脚本主文件。当然为了方便目录的组织,也允许在各个目录下面存放SConscript, 然后最上面S...
潇洒哥 2015-03-26 22:53
RT-Thread学习之scons篇--SConcript文件解析
SConscript文件是用来指定哪些文件会加入编译。先来分析下BSP主目录下的SConscript文件: import rtconfig Import('RTT_ROOT') fro...
广告
我要评论
0
0
广告
关闭 热点推荐上一条 /2 下一条