本文内容:
1.进程通信的目的
2.介绍Linux下进程间的4种通信方式:管道,消息队列,共享内存,信号量
ps:套接字也可以用于进程间的通信,不过是不同物理机器上的进程通信,本章讨论是是同一台物理机器上的通信,套接字本章暂不讨论
一.进程间通信的目的
1)数据的传输
2)数据的共享
3)事件的通知
4)资源的共享
5)进程的控制
二.进程间的通信方式
1.管道
概念:管道是一种两个进程间进行单向通信的机制,因为管道传递数据的单向性,管道又称之为半双工管道
分类:匿名管道和有名管道
特点:
1)数据只能由一个进程流向另一个进程,如果要进行双工通信,则需要建立两个管道(一个读管道,一个写管道)
2)匿名管道只能用于父子进程或者兄弟进程间的通信,有名管道则不受这个限制
3)管道缓冲区的大小是有限制的
4)管道传输的是无格式的字节流,需要传输双方事先约定传输格式
5)管道也是一种文件,但这个文件只存在于内存中
管道创建:
pipe()函数
int pipe(int fd[2])
1.管道两端分别用fd[0]和fd[1]描述
2.管道两端是固定了任务的,即一端只能用来读,一端只能用来写,规定fd[0]为读端,fd[1]为写端
样例程序:建立一个子进程读,父进程写的匿名管道
#include <iostream> #include<pthread.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include<semaphore.h> #include<sys/wait.h> #include<sys/types.h> #include<fcntl.h> #include<sys/stat.h> using namespace std; #define input 0 #define output 1 int main() { int fd[2]; pid_t pid; pipe(fd); pid=fork(); if(pid<0) { cout<<"fork error"<<endl; return 0; }else if(pid==0) { cout<<"in child process"<<endl; close(fd[input]); char str[]="hello,my parents"; write(fd[output],str,strlen(str)); exit(0); }else { cout<<"in parent process"<<endl; close(fd[output]); char str[256]; int num=read(fd[input],str,sizeof(str)); str[num]='