在计算机科学中,IPC通常指的是“进程间通信”(Inter-Process Communication)。IPC是一种允许不同进程之间进行数据交换和协调工作的机制。由于不同的进程可能运行在不同的地址空间,因此它们之间的通信不像线程间通信那样直接。为了实现这些进程间的有效沟通,操作系统提供了多种IPC机制,包括但不限于:
管道(Pipes)和命名管道(Named Pipes)
信号量(Semaphores),用于控制对共享资源的访问
共享内存(Shared Memory),让多个进程能够访问同一块内存区域
消息队列(Message Queues),用于进程间发送和接收消息
套接字(Sockets),不仅支持本机进程间通信,还支持通过网络连接的不同机器上的进程间通信
每种机制都有其适用场景和优缺点,开发者可以根据具体的应用需求选择合适的IPC方式。
进程
fork() 系统调用用于创建一个新进程,返回值会根据当前进程的不同情况有所不同:
-
- 在父进程中,返回新创建的子进程的 PID(大于0)。
- 在子进程中,返回 0。
- 如果 fork() 调用失败,返回负值。
1.消息队列
下面是一个简单的消息队列示例程序,包括发送进程和接收进程:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>#define MSG_KEY 1234/* 定义消息结构体 */
struct mymsg {long mtype; /* 消息类型 */char mtext[1024]; /* 消息内容 */
};/* 发送进程 */
void sender()
{int msgid, ret;struct mymsg msg;/* 创建或打开消息队列 */msgid = msgget(MSG_KEY, IPC_CREAT | 0666);if (msgid < 0) {perror("msgget");exit(1);}/* 构造消息 */msg.mtype = 1;strncpy(msg.mtext, "Hello, waveshare!", 1024);/* 发送消息 */ret = msgsnd(msgid, &msg, sizeof(struct mymsg) - sizeof(long), 0);if (ret < 0) {perror("msgsnd");exit(1);}printf("Sent message: %s\n", msg.mtext);
}/* 接收进程 */
void receiver()
{int msgid, ret;struct mymsg msg;/* 打开消息队列 */msgid = msgget(MSG_KEY, IPC_CREAT | 0666);if (msgid < 0) {perror("msgget");exit(1);}/* 接收消息 */ret = msgrcv(msgid, &msg, sizeof(struct mymsg) - sizeof(long), 1, 0);if (ret < 0) {perror("msgrcv");exit(1);}printf("Received message: %s\n", msg.mtext);
}int main()
{pid_t pid;/* 创建子进程 */pid = fork();if (pid < 0) {perror("fork");exit(1);} else if (pid == 0) {/* 子进程作为发送进程 */sender();} else {/* 父进程作为接收进程 */receiver();}return 0;
}