常用IPC有:
1:管道
2:命名管道(FIFO)
3:共享存储
4:套接字
5:信号量
6:消息队列
7:信号
管道 只允许亲缘进程间的通讯。
命名管道(FIFO) 除了亲缘进程可以通讯外,非亲缘进程也可以通讯。
共享内存 多个进程可以访问同一块内存空间,是最快的IPC方式。在进程间传递数据时无须任何内存的拷贝 。可以在亲缘和非亲缘的进程间使用。
套接字 最通用的进程间通讯方式,它提供了一种让不同机器上进程间通讯方式。 消息队列 可以用在非亲缘关系的进程之间使用
信号量(semaphore) 主要是线程间和亲缘和非亲缘的进程间的同步手段,不做数据传输之用。
消息队列 可以用在非亲缘关系的进程之间使用
信号(signal) 亲缘进程和非亲缘进程都可以, 也可以进程自己给自己递送信号。
命名管道程序:
1 int main() 2 { 3 pid_t pid; 4 int fd[2]; 5 char line[100]; 6 if(pipe(fd)<0) 7 { 8 printf("pipe error\n"); 9 } 10 if((pid = fork())<0) 11 { 12 printf("fork error\n"); 13 } 14 else if(0 == pid) 15 { 16 close(fd[1]); 17 read(fd[0],line,11); 18 printf("%s",line); 19 exit(0); 20 } 21 else 22 { 23 close(fd[0]); 24 write(fd[1],"hello word\n",11); 25 } 26 }
共享存储允许两个或多个进程共享一给定的存储区。因为数据不需要在客户机和服务器之间复制,所以这是最快的一种I P C。使用共享存储的唯一窍门是多个进程之间对一给定存储区的同步(互斥访问)存取。若服务器将数据放入共享存储区,则在服务器做完这一操作之前,客户机不应当去取这些数据,
通常,信号量(无亲缘关系的进程间)被用来实现对共享存储存取的同步。
void* mmap ( void * addr , size_t length , int prot , int flags , int fd , off_t offset ) mmap在进程地址空间创建一个映射。它既可以把一个文件映射到内存,也可以映射一块内存,实现进程间内存共享。
一旦创建了一个共享存储段,进程就可调用shmat将其连接到它的地址空间中