欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > Linux进程间通信

Linux进程间通信

2025/7/17 7:26:40 来源:https://blog.csdn.net/m0_74057742/article/details/148210768  浏览:    关键词:Linux进程间通信

在计算机科学中,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;
}

2.共享内存

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词