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 消息队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值