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.shmgetpost

#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\n",shmid);
    system("ipcs -m");    //查看

    sprintf(cmd,"ipcrm -m %d",shmid);
    system(cmd);
    return 0;
}

 

2.spa

相關文章
相關標籤/搜索