原创 进程间无名管道通信

2015-3-7 16:30 963 18 18 分类: 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条评论)

登录后参与讨论
我要评论
0
18
1
2
3
4
5
6
7
8
9
0
关闭 站长推荐上一条 /4 下一条