zoukankan      html  css  js  c++  java
  • linux进程篇 (三) 进程间的通信3 IPC通信

    3 IPC通信

    用户空间         进程A          <----无法通信---->        进程B
    -----------------|--------------------------------------|--------------
                    |                                    |
    内核空间         |<------------->  IPC <--------------->|    
    
    ----------------------------------------------------------------------
    
    IPC分3种:
        消息队列 共享内存 信号灯
        
        open                    msgget                    shmget         semget
        read/write        msgsen msgrecv     shmat shmdt semop
        close                    msgctrl         shmctrl     semctrl

    3.1 共享内存

    #include <sys/shm.h>
    #include <sys/ipc.h>
    #include <sys/types.h>
    
    int shmget(key_t key, size_t size, int shmflg);    //创建共享内存
    key_t ftok(const char *path, int id);    //创建key值
    
    void *shmat(int shmid, const void *shmaddr, int shmflg);    //将共享内存的地址映射到用户空间
    int shmdt(const void *shmaddr);
    int shmget(key_t key, size_t size, int shmflg);
    
    //key IPC_PRIVATE 或者ftok的返回值
    //size_t size 共享内存的大小#include <sys/ipc.h>
    
    system("ipcs -m");    //查看共享内存
    sprintf(cmd,"ipcrm -m %d",shmid);
    system(cmd);        //删除共享内存
    
    key_t ftok(const char *path, int id);    //创建key值
    //path文件路径,id 一个字符
    //成功-> key 失败-> -1;
    void *shmat(int shmid, const void *shmaddr, int shmflg);    //将共享内存的地址映射到用户空间
    //int shmid :ID号
    //const void *shmaddr 映射到的地址,NULL为系统自动分配
    //shmflg SHM_RDONLY 只读,默认是0 可读可写
    //返回值 映射后的地址。 失败NULL

    3.2 消息队列

    3.3 信号灯

    #include <sys/sem.h>
    
    int semget(key_t key, int nsems, int semflg);    //创建sem信号灯
    
    int semctl(int semid, int semnum, int cmd, ...); //关闭sem信号灯
    
    #include <semaphore.h>
    int sem_wait(sem_t *sem);
    int sem_post(sem_t *sem);

    例子 1.shmget

    #include <stdio.h>
    #include <string.h>
    #include <sys/shm.h>
    #include <sys/ipc.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    int main(int argc, char const *argv[])
    {
        int shmid;
        char cmd[128];
        shmid = shmget(IPC_PRIVATE,128,0755);
        if(shmid < 0){
            perror("shmget");
        }
        printf("shmid = %d
    ",shmid);
        system("ipcs -m");    //查看
    
        sprintf(cmd,"ipcrm -m %d",shmid);
        system(cmd);
        return 0;
    }

    2.

  • 相关阅读:
    vue 画/生成二维码
    2017年要学习的三个CSS新特性
    最好的Angular2表格控件
    最详细win7下手动搭建PHP环境:apache2.4.23+php7.0.11
    Javascript实现页面跳转的几种方式
    windows环境下sublime的nodejs插件详细安装图解
    CSS3 动画
    框架基础:ajax设计方案(一)---集成核心请求
    框架基础:ajax设计方案(二)---集成轮询技术
    框架基础:ajax设计方案(三)---集成ajax上传技术
  • 原文地址:https://www.cnblogs.com/kmist/p/10640177.html
Copyright © 2011-2022 走看看