加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux进程篇 (三) 进程间的通信3 IPC通信

发布时间:2020-12-14 01:48:50 所属栏目:Linux 来源:网络整理
导读:3 IPC通信 用户空间 进程A ----无法通信---- 进程B -----------------|--------------------------------------|-------------- | | 内核空间 |------------- 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,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,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 = %dn",shmid);
    system("ipcs -m");    //查看

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

?

2.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读