【Linux学习笔记】----进程间通信(管道(命名管道,匿名管道)、共享内存、消息队列、信号量机制)

1.管道

  1. 管道
    本质:管道是内核中的一块缓冲区,用于实现进程间的通信
    通信过程需要用户态到内核态,再到用户态的情况。
    特性:
    (1).半双工通信方式,(可双向传递数据,同一时刻只能单向)
    (2).生命周期随进程,进程退出,管道释放。
    (3).以只读方式打开会阻塞,直到文件以写的方式打开,以只写的方式打开会阻塞,直到文件以读的方式打开。
    (4).如果没有数据,读会阻塞,如果数据慢了写操作会阻塞,管道大小(64k)
    (5).当所有读端被关闭时,(父子进程),写端会阻塞,当所有写端被关闭时,读端读完数据,读端会返回0
    (6).管道操作,不限制进程数量,一个管道可以被多个进程访问。(同步与互斥保证安全性)
    (7).字节流服务,数据读完就拿走了。
    (8).自带同步与互斥
    互斥:同一时间,临界资源只能被一个进程访问,其他的加入阻塞队列中。
    同步:管道满了,写端阻塞,直到读端将所有数据读走,管道中没数据读端会阻塞,直到写入新的数据,
  2. 匿名管道
    (1).特点
    用于实现具有亲缘关系的进程间通信,要在fork之前创建管道,不然不能操作管道。
    (2).接口
    int pipefd[2]={-1 }
    pipefd[0]----读
    pipefd[1]----写
    int fd = pipe(pipefd[ ])
    返回值:成功返回文件操作句柄,失败返回-1。
    操作:获取文件操作句柄之后,然后进行读写操作。
  3. 命名管道
    (1).特点
    用于实现同一主机任意进程间通信,通过命名管道文件实现通信。
    (2).接口
    mkfifo test.fifo创建命名管道文件,文件名最前面有p的文件类型表示。
    int fd = mkfifo(char* filename,mode_t mode)
    mkfifo ("./test.fifo",0664)
    管道文件名,操作权限
    创建完成,用open打开,其余操作和文件操作类似。

2.共享内存

  1. 创建共享内存
    int shmget(KEY,size, shmflg)
    参数:内核中共享内存标识,内存页大小(4096),权限设置(IPC_CREAT,IPC_EXCL | 0664)
    返回值:成功返回非负数操作句柄,失败返回-1
  2. 建立映射关系
    void* shmat(shmid,buf,shmflg)
    参数:操作句柄,共享内存首地址(通常置NULL),操作权限(SHM_RDONLY,只读,0可读可写)
    返回值:成功返回首地址指针,失败返回(void*)-1
  3. 操作共享内存
  4. 解除映射关系
    int shmdt(buf)
    参数:共享内存首地址
    返回值:成功返回0,失败返回-1
  5. 删除共享内存
    int shmct (shmid,IPC_RMID,NULL)
    参数:共享内存操作句柄,对共享内存的操作(IPC_RMID),获取或设置共享内存信息结构(NULL)
    返回值:成功返回0,失败返回-1
  6. 特点
    删除共享内存并不会立即删除,而是将其状态设置为销毁状态,为的是不让其被其他进程继续映射链接,直到链接数为0时,才删除这块共享内存。
    共享内存操作的是首地址,所以写入的时候是覆盖式写入,同时也没有自带同步与互斥,存在安全性问题(需要加锁保证安全)并且当写端关闭时,读端读取出来的是最后一次写入的数据。
    生命周期随内核,进程退出时,不会释放该空间,关机才会释放,是一种最快的通信方式,本质原理是操作同一块物理内存,避免内核态和用户态的切换。
hello world+1
hello world+2
hello world+3
hello world+4
hello world+5
hello world+6
hello world+7
hello world+8
hello world+9
hello world+10
hello world+10
hello world+10
hello world+10

3.消息队列

  1. 消息队列
    消息队列是内核中一个优先级队列,通过多个进程访问一个队列,进行添加或获取节点进行通信。
  2. 接口
    创建优先级队列
    int msgget(key_t key,int msgflg)
    参数:标识符,权限。
    返回值:成功返回操作句柄,失败返回-1;
    向发送消息
    int msgsnd(int msqid,const void* msgp,size_t msgsz, int msgflg)
    参数:操作句柄,指向结构体的指针,大小,操作权限
    从队列接收
    ssize_t msgrcv(int msqid, void msgp, size_t msgsz, long msgtyp,int msgflg);
    参数:操作句柄,指向结构体的指针,大小,类型,操作权限
    删除优先级队列int msgctl(int msqid,int cmd,struct msqid_ds
    buf)
    参数:操作句柄,操作权限,用于获取或设置优先级队列信息
    返回值:成功返回0,失败返回-1
           struct msgbuf {
               long mtype;       /* message type, must be > 0 */
               char mtext[1];    /* message data */
           };

4.信号量机制

1.信号量是实现进程间的同步与互斥
互斥:同一时间,只有一个进程能访问临界资源。
同步:能访问就访问,不能访问就加入等待队列。
临界资源:一次仅允许一个进程使用的共享资源。
临界区:临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段。
实现过程:计数器+等待队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值