Linux中的System V通信标准--共享内存、消息队列以及信号量

简介: 希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。

Linux中的System V通信标准——共享内存、消息队列以及信号量

在Linux系统中,System V IPC(Inter-Process Communication)提供了一系列进程间通信的机制,包括共享内存、消息队列和信号量。这些机制在系统中发挥了重要作用,帮助进程之间进行数据交换和同步。本文将详细介绍这些机制的概念、使用方法以及应用场景。

一、共享内存

1.1 概念

共享内存(Shared Memory)是最快的一种进程间通信方式,它允许多个进程直接访问同一块内存区域,从而实现高效的数据交换。共享内存由内核管理,每个进程可以将共享内存段映射到自身的地址空间。

1.2 使用方法

创建和附加共享内存

创建或获取一个共享内存段:

#include <sys/ipc.h>
#include <sys/shm.h>

int shm_id = shmget(key_t key, size_t size, int shmflg);
​

附加共享内存段到进程的地址空间:

void *shmaddr = shmat(int shm_id, const void *shmaddr, int shmflg);
​

数据读写

共享内存的读写操作直接通过指针进行,如同普通内存操作。

分离和删除共享内存

分离共享内存段:

int shmdt(const void *shmaddr);
​

删除共享内存段:

int shmctl(int shm_id, IPC_RMID, NULL);
​

1.3 示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int main() {
    key_t key = ftok("shmfile", 65);
    int shm_id = shmget(key, 1024, 0666|IPC_CREAT);
    char *str = (char*) shmat(shm_id, (void*)0, 0);

    printf("写入数据到共享内存\n");
    strcpy(str, "Hello, World!");

    printf("数据: %s\n", str);
    shmdt(str);
    shmctl(shm_id, IPC_RMID, NULL);
    return 0;
}
​

二、消息队列

2.1 概念

消息队列(Message Queue)是一种以消息为单位的进程间通信机制,允许一个或多个进程以有序的方式发送和接收消息。消息队列在内核中维护,进程通过消息队列标识符进行操作。

2.2 使用方法

创建和获取消息队列

创建或获取一个消息队列:

#include <sys/ipc.h>
#include <sys/msg.h>

int msg_id = msgget(key_t key, int msgflg);
​

发送消息

int msgsnd(int msg_id, const void *msgp, size_t msgsz, int msgflg);
​

接收消息

ssize_t msgrcv(int msg_id, void *msgp, size_t msgsz, long msgtyp, int msgflg);
​

删除消息队列

int msgctl(int msg_id, IPC_RMID, NULL);
​

2.3 示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>

struct msg_buffer {
    long msg_type;
    char msg_text[100];
};

int main() {
    key_t key = ftok("msgfile", 65);
    int msg_id = msgget(key, 0666 | IPC_CREAT);
    struct msg_buffer message;

    message.msg_type = 1;
    strcpy(message.msg_text, "Hello, World!");
    msgsnd(msg_id, &message, sizeof(message), 0);

    printf("消息发送: %s\n", message.msg_text);

    msgrcv(msg_id, &message, sizeof(message), 1, 0);
    printf("消息接收: %s\n", message.msg_text);

    msgctl(msg_id, IPC_RMID, NULL);
    return 0;
}
​

三、信号量

3.1 概念

信号量(Semaphore)是一种用于同步进程操作的机制,可以控制多个进程对共享资源的访问。信号量可以是单个信号量(用于简单的互斥)或信号量集合(用于复杂的同步)。

3.2 使用方法

创建和获取信号量

创建或获取一个信号量集:

#include <sys/ipc.h>
#include <sys/sem.h>

int sem_id = semget(key_t key, int num_sems, int semflg);
​

初始化信号量

int semctl(int sem_id, int semnum, SETVAL, union semun arg);
​

操作信号量

信号量操作包括P操作(等待)和V操作(信号),通常使用 semop函数进行操作。

struct sembuf {
    unsigned short sem_num;
    short sem_op;
    short sem_flg;
};

int semop(int sem_id, struct sembuf *sops, size_t nsops);
​

3.3 示例代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>

union semun {
    int val;
    struct semid_ds *buf;
    unsigned short *array;
};

void sem_wait(int sem_id) {
    struct sembuf sem_op;
    sem_op.sem_num = 0;
    sem_op.sem_op = -1;
    sem_op.sem_flg = 0;
    semop(sem_id, &sem_op, 1);
}

void sem_signal(int sem_id) {
    struct sembuf sem_op;
    sem_op.sem_num = 0;
    sem_op.sem_op = 1;
    sem_op.sem_flg = 0;
    semop(sem_id, &sem_op, 1);
}

int main() {
    key_t key = ftok("semfile", 65);
    int sem_id = semget(key, 1, 0666 | IPC_CREAT);
    union semun sem_union;
    sem_union.val = 1;
    semctl(sem_id, 0, SETVAL, sem_union);

    if (fork() == 0) {
        sem_wait(sem_id);
        printf("子进程正在使用共享资源\n");
        sleep(2);
        printf("子进程释放共享资源\n");
        sem_signal(sem_id);
    } else {
        sem_wait(sem_id);
        printf("父进程正在使用共享资源\n");
        sleep(2);
        printf("父进程释放共享资源\n");
        sem_signal(sem_id);
    }

    semctl(sem_id, 0, IPC_RMID, sem_union);
    return 0;
}
​

四、总结

本文详细介绍了Linux中的System V通信标准,包括共享内存、消息队列和信号量。共享内存提供了最快的进程间通信方式,消息队列以消息为单位进行通信,信号量用于控制和同步进程对共享资源的访问。这些机制各有优劣,适用于不同的场景。在实际开发中,合理选择和使用这些机制,可以提高系统的性能和可靠性。

希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。

目录
相关文章
|
6月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
576 0
Linux内存问题排查命令详解
|
10月前
|
缓存 Linux 数据安全/隐私保护
Linux环境下如何通过手动调用drop_caches命令释放内存
总的来说,记录住“drop_caches” 命令并理解其含义,可以让你在日常使用Linux的过程中更加娴熟和自如。
1634 23
|
12月前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
413 27
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
511 3
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
2360 2
|
8月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
2773 0
|
8月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
900 2
|
8月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
1074 0
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
1049 0