4. 進(jìn)程間通信--共享內(nèi)存、信號(hào)燈

共享內(nèi)存

共享內(nèi)存是一種最為高效的進(jìn)程間通信方式,進(jìn)程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝.

int shmget(key_t key, size_t size, int shmflg);
功能:創(chuàng)建并打開共享內(nèi)存

void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:映射:在當(dāng)前進(jìn)程獲得一個(gè)共享內(nèi)存的訪問地址

int shmdt(const void *shmaddr);
功能:解除映射:解除共享內(nèi)存的訪問權(quán)

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:刪除共享內(nèi)存

/*共享內(nèi)存:最高效的通信方式*/
//向共享內(nèi)存中寫數(shù)據(jù)
#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[])
{
    /*創(chuàng)建并打開共享內(nèi)存*/
    key_t key = ftok(".", 1);
    int shmid = shmget(key, sizeof(struct shmbuf), IPC_CREAT|0664 );
    if(shmid == -1)
    {
        perror("shmget error");
        exit(1);
    }

    /*映射:在當(dāng)前進(jìn)程獲得一個(gè)共享內(nèi)存的訪問地址*/
    struct shmbuf *p;
    p = (struct shmbuf *)shmat(shmid, NULL, 0);

    /*訪問:寫*/
    p->a = 10;
    p->b = 12.34;
    p->c = 'G';

    /*解除映射:解除共享內(nèi)存的訪問權(quán)*/
    shmdt(p);
    system("ipcs -m");

    return 0;
}

/*共享內(nèi)存:最高效的通信方式*/
//從共享內(nèi)存中讀數(shù)據(jù)
#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[])
{
    /*創(chuàng)建并打開共享內(nèi)存*/
    key_t key = ftok(".", 1);
    int shmid = shmget(key, sizeof(struct shmbuf), IPC_CREAT|0664 );
    if(shmid == -1)
    {
        perror("shmget error");
        exit(1);
    }

    /*映射:在當(dāng)前進(jìn)程獲得一個(gè)共享內(nèi)存的訪問地址*/
    struct shmbuf *p;
    p = (struct shmbuf *)shmat(shmid, NULL, 0);

    /*訪問:讀*/
    printf("shm: %d--%f--%c\n",p->a,p->b,p->c);

    /*解除映射:解除共享內(nèi)存的訪問權(quán)*/
    shmdt(p);
    system("ipcs -m");

    return 0;
}

信號(hào)燈

int semget(key_t key, int nsems, int semflg);
功能:創(chuàng)建信號(hào)燈
參數(shù):nsems:創(chuàng)建的信號(hào)燈中信號(hào)量的個(gè)數(shù)

int semctl(int semid, int semnum, int cmd);
int semctl(int semid, int semnum, int cmd, union semun).
功能:設(shè)置信號(hào)燈值,刪除信號(hào)量、獲取信號(hào)量
參數(shù):semnum:選擇操作的信號(hào)量編碼
cmd:執(zhí)行的命令 SETVAL GETVAL(需要第四個(gè)參數(shù)) IPC_RMID

int semop(int semid, struct sembuf * sops, unsigned nsops);
功能 :執(zhí)行PV操作
參數(shù) :

sops:
unsigned short    sem_num;  / * semaphore number * /
short             sem_op;   / * semaphore operation * /
short             sem_flg;  / * operation flags * /
nsops:同時(shí)操作信號(hào)量的個(gè)數(shù)
#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[])
{
    //創(chuàng)建信號(hào)燈
    key_t key = ftok(".", 1);
    int semid = semget(key, 1, IPC_CREAT|0664);
    if(semid == -1)
    {
        perror("semget error");
        return -1;
    }

    //設(shè)置信號(hào)燈中某一個(gè)信號(hào)量的初始值
    union  semun semun;
    semun.val = 3;
    semctl(semid, 0, SETVAL, semun);
    //獲取信號(hào)燈中某一個(gè)信號(hào)量的初始值
    printf("val = %d\n",semctl(semid, 0, GETVAL));


    //P:消耗信號(hào)燈中某一個(gè)信號(hào)量值
    struct sembuf sembuf;
    sembuf.sem_num = 0;             //信號(hào)燈中信號(hào)量的編碼
    sembuf.sem_op  = -2;            //一次性消耗2個(gè)信號(hào)量值
    sembuf.sem_flg = 0;             //阻塞模式 ,非阻塞(IPC_NOWAIT)
    semop(semid, &sembuf, 1);
    printf("val = %d\n",semctl(semid, 0, GETVAL));


    //V:增加信號(hào)燈中某一個(gè)信號(hào)量值
    sembuf.sem_num = 0;             //信號(hào)燈中信號(hào)量的編碼
    sembuf.sem_op  = 5;             //一次性增加5個(gè)信號(hào)量值
    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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容