4.王道_进程间通信

在这里插入图片描述

4.1 管道

在这里插入图片描述

  • 有名管道的创建
    • 库函数
    • mkfifo

4.1.1 popen和pclose

  • popen和pclose是一个库函数,即在windows中也可以使用。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.1.2 pipe

在这里插入图片描述

  • 在fork之前打开的文件对象,在fork之后是共享的
    在这里插入图片描述
    在这里插入图片描述

  • 只读不写会阻塞,只写不读不会阻塞。

  • 在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.1.3 FIFO

在这里插入图片描述

4.2 共享内存

  • 最快的IPC

使用的原因

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

System V 版本的共享内存

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • taskset -c 0 ./a.out 只使用0号cpu
    在这里插入图片描述

创建/获取共享内存

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
    int shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT | 0666);
    if (shmid == -1) {
        perror("shmget");
        exit(1);
    }

    struct shmid_ds shminfo;

    // 查看共享内存信息
    shmctl(shmid, IPC_STAT, &shminfo);
    printf("Before attach: nattch = %ld\n", shminfo.shm_nattch);

    // 进程附加共享内存
    char *shmaddr = (char *)shmat(shmid, NULL, 0);
    if (shmaddr == (void *)-1) {
        perror("shmat");
        exit(1);
    }

    // 再次查看共享内存信息
    shmctl(shmid, IPC_STAT, &shminfo);
    printf("After attach: nattch = %ld\n", shminfo.shm_nattch);

    // 进程分离共享内存
    shmdt(shmaddr);
    
    // 再次查看共享内存信息
    shmctl(shmid, IPC_STAT, &shminfo);
    printf("After detach: nattch = %ld\n", shminfo.shm_nattch);

    // 删除共享内存
    shmctl(shmid, IPC_RMID, NULL);

    return 0;
}

进程间的通信

共享内存可以在两个互不关联的进程之间进行通信,只需要彼此之间知道共享内存的键就好了。
在这里插入图片描述
先后执行shm_w和shm_r程序,后一个进程可以读取共享内存中前一个进程写入的信息

两个进程同时对共享内存写入

  • 共享内存可以实现多个进程同时对同一个数据进行访问和修改,这种并发的操作往往会造成预期外的错误。

在这里插入图片描述
在这里插入图片描述

解除共享内存映射

  • 使用 shmdt 可以解除堆空间到共享内存段的映射。具体的使用方法和 free 差不多。
    在这里插入图片描述

修改共享内存属性

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • ipcrm -m 也是删除共享内存
    在这里插入图片描述

在这里插入图片描述

私有共享内存

在这里插入图片描述

虚拟地址和物理地址转换机制

在这里插入图片描述

硬件分页机制

在这里插入图片描述

Linux的页管理

在这里插入图片描述

在这里插入图片描述

4.3 信号量

4.4 消息队列

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值