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