1. 核心理论
通讯目的:数据传输 资源共享 通知事件 进程控制
进程间通信IPC(interprocess communication)由以下几部分发展而来:
1. UNIX进程间通信
2. 基于System V进程间通信
3. POSIX进程间通信
POSIX(Portable Operating System Interface)表示可移植操作系统接口,电气与电子工程师协会IEEE最初开发POSIX标准,是为了提高UNIX环境下应用程序的可移植性,然而POSIX并不局限于UNXI,许多其他操作系统也支持,如microsoft windows
Linux进程间通信方式主要有:
1.无名管道pipe
2.有名管道FIFO
3.信号signal
4. 消息队列
5. 共享内存
6. 信号量
7. 套接字socket
管道通讯:
一个进程在管道的尾部写入数据,另一个进程在管道的头部读取数据,管道包括有名管道和无名管道
有名管道:任意进程间通信
无名管道:父子进程间通信
特点:
1.管道通讯是单向的,有固定的读端与写端
2. 数据从管道中度出去后,数据在管道中就不存在了
3. 当进程去读空管道的时候,进程会阻塞
4. 当进程往满管道写入数据时,进程会阻塞
5. 管道容量为64KB
无名管道
在linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件,无名管道的读取视作一个文件,无名管道的写端也被视作一个文件
2.函数学习
创建无名管道
函数名:pipe
函数原型:int pipe(int pipefd[2]);
函数功能:创建无名管道
头文件:<unistd.h>
返回值: 成功:0 失败:-1
参数说明: pipefd为文件描述符,pipefd[0]为读端,pipefd[1]位写端
#include <unistd.h>
#include <stdio.h>
void main()
{
pid_t pid;
int pipefd[2];
char c_buff[10];
pipe(pipefd);
pid = fork();
if(pid > 0)
{
write(pipefd[1],"hello",6);
wait();
close(pipefd[1]);
exit(0);
}
if(pid == 0)
{
read(pipefd[0],c_buff,6);
printf("child read %s\n",c_buff);
close(pipefd[0]);
exit(0);
}
}
运行结果:child read hello