linux 进程间通信_介绍Linux中的进程间通信指南

linux 进程间通信

使一个软件过程与另一个软件过程对话是一种微妙的平衡行为。 但是,它对于应用程序而言可能是至关重要的功能,因此这是任何从事复杂项目的程序员都必须解决的问题。 您的应用程序是否需要启动由别人的软件处理的工作; 监视外围设备或网络上正在执行的操作; 或检测来自其他来源的信号,当您的软件依靠其自身代码以外的内容来知道下一步该做什么或何时进行时,您需要考虑进程间通信(IPC)。

util-linux软件包包含用于监视和管理IPC消息的ipcmkipcrmipcslsipc命令。

显示IPC信息

在尝试IPC之前,您应该知道系统上已经有哪些IPC设施。 lsipc命令提供了该信息。


   
   
RESOURCE DESCRIPTION               LIMIT  USED  USE%
MSGMNI   Number of message queues  32000     0 0.00%
MSGMAX   Max size of message (byt.. 8192     -     -
MSGMNB   Default max size of queue 16384     -     -
SHMMNI   Shared memory segments     4096    79 1.93%
SHMALL   Shared memory pages       184[...] 25452 0.00%
SHMMAX   Max size of shared memory 18446744073692774399
SHMMIN   Min size of shared memory     1     -     -
SEMMNI   Number of semaphore ident 32000     0 0.00%
SEMMNS   Total number of semaphore 1024000.. 0 0.00%
SEMMSL   Max semaphores per semap  32000     -     -
SEMOPM   Max number of operations p  500     -     -
SEMVMX   Semaphore max value       32767     -     -

您可能会注意到,此示例清单包括三种不同类型的IPC机制,每种机制在Linux内核中都可用:消息(MSG),共享内存(SHM)和信号量(SEM)。 您可以使用ipcs命令查看每个子系统中的当前活动:


   
   
$ ipcs

------ Message Queues Creators/Owners ---
msqid     perms     cuid      cgid  [...]

------ Shared Memory Segment Creators/Owners
shmid     perms    cuid    cgid  [...]
557056    700      seth    users [...]
3571713   700      seth    users [...]
2654210   600      seth    users [...]
2457603   700      seth    users [...]

------ Semaphore Arrays Creators/Owners ---
semid     perms     cuid      cgid  [...]

这表明当前没有消息或信号量数组,但是正在使用许多共享内存段。

有一个简单的示例可以在您的系统上执行,因此您可以看到其中一个正在工作的系统。 它涉及一些C代码,因此您必须在系统上具有构建工具。 必须安装才能从源代码构建的软件包的名称因发行版而异,因此请参考文档以获取详细信息。 例如,在基于Debian的发行版上,您可以在Wiki的BuildingTutorial部分上了解构建要求,而在基于Fedora的发行版上,请参考文档的从源代码安装软件

创建一个消息队列

您的系统已经有一个默认的消息队列,但是您可以使用ipcmk命令创建自己的消息队列:


   
   
$ ipcmk --queue
Message queue id: 32764

编写一个简单的IPC消息发件人,为简单起见,在队列ID中进行硬编码:


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

struct msgbuffer {
  char text[24];
} message;

int main() {
    int msqid = 32764;
    strcpy(message.text,"opensource.com");
    msgsnd(msqid, &message, sizeof(message), 0);
    printf("Message: %s\n",message.text);
    printf("Queue: %d\n",msqid);
    return 0;
        }

编译应用程序并运行它:


   
   
$ gcc msgsend.c -o msg.bin
$ ./msg.bin
Message: opensource.com
Queue: 32769

您刚发送了一条消息到您的消息队列。 您可以使用ipcs命令,使用--queue选项将其限制为输出到消息队列,以进行验证:


   
   
$ ipcs -q

------ Message Queues --------
key        msqid   owner  perms  used-bytes  messages
0x7b341ab9 0       seth   666    0          0
0x72bd8410 32764   seth   644    24         1

您还可以使用以下方法检索这些消息:


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

struct msgbuffer {
    char text[24];
} message;

int main() {
    int msqid = 32764;
    msgrcv(msqid, &message, sizeof(message),0,0);
    printf("\nQueue: %d\n",msqid);
    printf("Got this message: %s\n", message.text);
    msgctl(msqid,IPC_RMID,NULL);
    return 0;

编译并运行:


   
   
$ gcc get.c -o get.bin
$ ./get.bin

Queue: 32764
Got this message: opensource.com

下载电子书

这只是Marty Kalin的“ Linux中的进程间通信指南” (可从Opensource.com下载的最新免费(和知识共享)电子书)中提供的课程的一个示例。 在短短的几节课中,您将从消息队列,共享内存和信号灯,套接字,信号等中了解IPC的POSIX方法。 坐下来听Marty的书,您将成为一个消息灵通的程序员。 但这不仅适用于经验丰富的编码人员,如果您编写的只是外壳程序脚本,那么您将拥有有关管道(命名和未命名)和共享文件的大量实践知识,以及在使用共享文件时需要了解的重要概念或外部消息队列。

如果您对制作出色的动态和系统感知软件感兴趣,那么您需要了解IPC。 让这本书作为您的指南。

翻译自: https://opensource.com/article/20/1/inter-process-communication-linux

linux 进程间通信

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值