(本节笔记的具体实验代码,在这里)
1. Linux中进程间通信(IPC:Inter-Process Communication ) 基本原理
1.1 作用:
数据传输,一个进程需要把数据发送到另一个进程。
资源共享,多个进程共享同样的资源。
通知事情,一个进程需要向另一个(组)进程发送消息,通知它们发生了某件事(例如生产者消费者)
进程控制,有些进程希望完全控制另一个进程的执行,此时,控制进程希望能够拦截另一个进程的所有操作,并能够及时知道他的状态变化(例如Debug)
1.2 IPC的发展过程
UNIX进程间通信
基于System V的进程间通信
POSIX进程间通信(POSIX Portable Operating System Interface,可移植操作系统接口,不局限于UNIX,其他OS例如Windows也能支持)
1.3 IPC的主要方式
无名管道(pipe)
有名管道(fifo) (以上两种一般用于数据传输)
信号(signal) (通知事件)
消息队列
共享内存
信号量 (资源共享)
网络套接字socket
1.4 管道通信
概念:
一个进程在管道的尾部写入数据,另一个进程在管道的头部读出数据
分类:
无名管道,用于父进程和子进程间的通信
有名管道,用于运行于同一个系统中的任意两个进程间的通信
特点:
管道通信是单向的,有固定的读端和写端;
数据被进程从管道中读出后,在管道中该数据就不存在了;
当进程去读取空管道时,进程会阻塞;
当进程往满管道写入数据时,进程会阻塞;
管道空间为64kb,定义在/include/linux/pipe_fs_i.h里,#define PIPE_BUFFERS 16
2. 无名管道——一旦创建完成后,操作无名管道等同于操作文件
2.1 创建管道
函数名:
pipe
函数原型:(man 2 pipe)
int pipe (int pipefd[2]);
函数功能:
创建无名管道
所属头文件:
<unistd.h>
返回值:
成功:返回0 失败:返回-1
参数说明:
pipefd[2]:用于返回2个文件描述符
pipefd[0]:指向读端
pipefd[1]:指向写端
2.2 管道创建完后,可用read,write,close来对管道进行访问。
2.3 范例代码:(touch piperw.c)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char ** argv)
{
pid_t pid = 0;
int pipefd[2];
char c_buf[10];
pipe(pipefd);
pid = fork();
if (pid > 0)
{
write(pipefd[1], "hello", 6);
wait();
close(pipefd[1]);
exit(0);
}
else
{
read(pipefd[0], c_buf,6);
printf("child read %s\n",c_buf);
close(pipefd[0]);
exit(0);
}
}