UNIX高级编程【深入浅出】 进程间的通信 PIPE/FIFO管道

目录

进程的关系

有亲缘关系的进程(related process)

没有亲缘关系的进程

IPC进程间通信

通信的方式

单工

半双工

全双工

PIPE/FIFO管道 (半双工)

查看管道 

管道的性质与行为

命名管道(半双工)

SysV IPC也称为XSI IPC

什么是Sys V IPC

命令

ipcs 查看当前系统所拥有的sys V IPC

ipcrm 删除指定的sys V ipc的机制

手册

通用的特性

共享内存 (shared  memory  segments)

如何创建

将共享内存与进程的虚拟地址空间映射

共享内存与进程的虚拟地址空间解除映射

销毁共享内存


  1. 进程的关系

    1. 有亲缘关系的进程(related process)
      1. 父子/兄弟
      2. 匿名管道/Sys V IPC
    2. 没有亲缘关系的进程
      1. 命名管道/Sys V IPC
    3. IPC进程间通信
      1. 进程之间数据交换
  2. 通信的方式

    1. 单工
      1. 数据流的方向只能流向一端
    2. 半双工
      1. 数据流的方向可以流向两端,但是都是只能选择一个方向
    3. 全双工
      1. 数据流的方向可以流向两端
  3. PIPE/FIFO管道 (半双工)

    1. 查看管道 
      1. man 7 pipe
    2. 管道的性质与行为
      1. pipe匿名管道
      2. 通过pipe(2)函数创建
      3. 分读端写端,数据从读端读,写端写
      4. 管道必须凑齐读写双方
      5. 读空管道,read(2)阻塞
      6. 写满管道,write(2)会阻塞
      7. 如果所有的写端关闭,read会读到eof,并返回0
      8. 如果所有的读端关闭,write会产生一个SIGPIPE信号,如果信号被忽略,write函数会返回-1并设置errno为EPIPE
      9. 有容量的,默认大小是65535bytes
// Date:2023.09.05 10:11:53
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#define handler_error(msg) \
		do	{ perror(msg); exit(EXIT_FAILURE); } while(0)
/* 匿名管道的使用  简单常用 */
int main(void)
{
	pid_t pid;
	int pip[2] = {};

	if(-1 == pipe(pip))
		handler_error("pipe()");

	if(-1 == (pid = fork())){
		perror("fork()");
		goto ERROR;
	}
	
	if(pid == 0){
		close(pip[0]); // 关闭读端
		
		// 子进程进行 写入数据
	    // ...

		close(pip[1]); // 关闭写端
		exit(0);
	}
	close(pip[1]);	   // 关闭写端
	
	// 父进程进行 读操作
	// ...
	
	close(pip[0]);	   // 关闭读端

	wait(NULL);		   // 为子进程收尸

	exit(0);
ERROR:
	close(pip[0]);
	close(pip[1]);
	exit(1);
}
  1. 命名管道(半双工)
    1. mkfifo(3)
    2. 需了解,用的不多,主要因为命名管道只要进程对文件有读写权限就可以对管道文件操作,相对安全性比较低
  2. SysV IPC也称为XSI IPC(本篇文章只介绍共享内存)

    1. 什么是Sys V IPC
      1. 消息队列   (message queues)
      2. 共享内存   (shared  memory  segments)
      3. 信号量集   ( semaphore sets)
    2. 命令
      1. ipcs 查看当前系统所拥有的sys V IPC
      2. ipcrm 删除指定的sys V ipc的机制
        1. 消息队列 ipcrm -q msgid
        2. 共享内存 ipcrm -m shmid
        3. 信号量 ipcrm -s semid
    3. 手册
      1. man 7 svipc
    4. 通用的特性
      1. 都能应用于有亲缘关系的进程和没有亲缘关系的进程
      2. 都是使用一个非负整型数作为其标识
      3. 获取实例(消息队列 共享内存 信号量)的方法都是xxxget(2)
        1. msgget(2)
        2. shmget(2)
        3. semget(2)
      4. 对于没有亲缘关系的进程都需要使用同一个key值,key的获取方法都是一样的
        1. ftok(3)
      5. 对于有亲缘关系的进程都是使用IPC_PRIVATE宏进行获取实例
        1. 操作函数在man手册的时候都是xxxop(2)
          1. man 2 msgop
            1. msgsnd(2) / msgrcv(2)
          2. man 2 shmop
            1. shmat(2) / shmdt(2)
          3. man 2 semop
        2. 销毁实例都是xxxctl, 都是使用一个宏IPC_RMID
          1. msgctl(2)
          2. shmctl(2)
          3. semctl(2)
    5. 共享内存 (shared  memory  segments)
      1. 进程间可以共享同一段存储空间,将这段存储空间就称为共享内存
      2. 如何创建
        1. shmget(2)
      3. 将共享内存与进程的虚拟地址空间映射
        1. shmat(2)
      4. 共享内存与进程的虚拟地址空间解除映射
        1. shmdt(2)
      5. 销毁共享内存
        1. shmctl(2)--->IPC_RMID
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值