4. 进程间通信--共享内存、信号灯

共享内存

共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝.

int shmget(key_t key, size_t size, int shmflg);
功能:创建并打开共享内存

void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:映射:在当前进程获得一个共享内存的访问地址

int shmdt(const void *shmaddr);
功能:解除映射:解除共享内存的访问权

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:删除共享内存

/*共享内存:最高效的通信方式*/
//向共享内存中写数据
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>

struct shmbuf{
    int a;
    float b;
    char c;
};

int main(int argc, const char *argv[])
{
    /*创建并打开共享内存*/
    key_t key = ftok(".", 1);
    int shmid = shmget(key, sizeof(struct shmbuf), IPC_CREAT|0664 );
    if(shmid == -1)
    {
        perror("shmget error");
        exit(1);
    }

    /*映射:在当前进程获得一个共享内存的访问地址*/
    struct shmbuf *p;
    p = (struct shmbuf *)shmat(shmid, NULL, 0);

    /*访问:写*/
    p->a = 10;
    p->b = 12.34;
    p->c = 'G';

    /*解除映射:解除共享内存的访问权*/
    shmdt(p);
    system("ipcs -m");

    return 0;
}

/*共享内存:最高效的通信方式*/
//从共享内存中读数据
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>

struct shmbuf{
    int a;
    float b;
    char c;
};

int main(int argc, const char *argv[])
{
    /*创建并打开共享内存*/
    key_t key = ftok(".", 1);
    int shmid = shmget(key, sizeof(struct shmbuf), IPC_CREAT|0664 );
    if(shmid == -1)
    {
        perror("shmget error");
        exit(1);
    }

    /*映射:在当前进程获得一个共享内存的访问地址*/
    struct shmbuf *p;
    p = (struct shmbuf *)shmat(shmid, NULL, 0);

    /*访问:读*/
    printf("shm: %d--%f--%c\n",p->a,p->b,p->c);

    /*解除映射:解除共享内存的访问权*/
    shmdt(p);
    system("ipcs -m");

    return 0;
}

信号灯

int semget(key_t key, int nsems, int semflg);
功能:创建信号灯
参数:nsems:创建的信号灯中信号量的个数

int semctl(int semid, int semnum, int cmd);
int semctl(int semid, int semnum, int cmd, union semun).
功能:设置信号灯值,删除信号量、获取信号量
参数:semnum:选择操作的信号量编码
cmd:执行的命令 SETVAL GETVAL(需要第四个参数) IPC_RMID

int semop(int semid, struct sembuf * sops, unsigned nsops);
功能 :执行PV操作
参数 :

sops:
unsigned short    sem_num;  / * semaphore number * /
short             sem_op;   / * semaphore operation * /
short             sem_flg;  / * operation flags * /
nsops:同时操作信号量的个数
#include <stdio.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/sem.h>

int main(int argc, const char *argv[])
{
    //创建信号灯
    key_t key = ftok(".", 1);
    int semid = semget(key, 1, IPC_CREAT|0664);
    if(semid == -1)
    {
        perror("semget error");
        return -1;
    }

    //设置信号灯中某一个信号量的初始值
    union  semun semun;
    semun.val = 3;
    semctl(semid, 0, SETVAL, semun);
    //获取信号灯中某一个信号量的初始值
    printf("val = %d\n",semctl(semid, 0, GETVAL));


    //P:消耗信号灯中某一个信号量值
    struct sembuf sembuf;
    sembuf.sem_num = 0;             //信号灯中信号量的编码
    sembuf.sem_op  = -2;            //一次性消耗2个信号量值
    sembuf.sem_flg = 0;             //阻塞模式 ,非阻塞(IPC_NOWAIT)
    semop(semid, &sembuf, 1);
    printf("val = %d\n",semctl(semid, 0, GETVAL));


    //V:增加信号灯中某一个信号量值
    sembuf.sem_num = 0;             //信号灯中信号量的编码
    sembuf.sem_op  = 5;             //一次性增加5个信号量值
    sembuf.sem_flg = 0;             //阻塞模式 ,非阻塞(IPC_NOWAIT)
    semop(semid, &sembuf, 1);
    printf("val = %d\n",semctl(semid, 0, GETVAL));


    //销毁
    system("ipcs -s");
    semctl(semid, 0, IPC_RMID);
    system("ipcs -s");

    
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容