Linux进程间通信方法和代码示例

Linux进程间通信(IPC, Inter-Process Communication)包括了多种不同的技术,例如管道(pipe)、信号(signal)、共享内存(shared memory)、消息队列(message queues)、信号量(semaphores)以及套接字(sockets)等。以下将针对每种通信方式给出简单的代码实例来进行说明。

  1. 管道(Pipe)

管道是最基本的IPC机制之一,这里指匿名管道,允许一个进程和另一个进程之间的单向数据流。这通常用于父进程与子进程之间的通信。

#include <stdio.h>
#include <unistd.h>int main() {int pipefd[2];pid_t cpid;char buf;if (pipe(pipefd) == -1) {perror("pipe");return 1;}cpid = fork();if (cpid == -1) {perror("fork");return 1;}if (cpid == 0) {    /* 子进程读取端 */close(pipefd[1]);          /* 关闭写端 */while (read(pipefd[0], &buf, 1) > 0)write(STDOUT_FILENO, &buf, 1);write(STDOUT_FILENO, "\n", 1);close(pipefd[0]);} else {            /* 父进程写入端 */close(pipefd[0]);          /* 关闭读端 */write(pipefd[1], "示例消息", 8);close(pipefd[1]);wait(NULL);                /* 等待子进程 */}return 0;
}
  1. 信号(Signal)

信号是一种软件中断机制,用于处理异步事件或通知进程发生了某个事件。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>void sighandler(int signum) {printf("捕获信号 %d\n", signum);exit(1);
}int main () {signal(SIGINT, sighandler);while(1) {printf("开始睡眠...\n");sleep(1); }return(0);
}
  1. 共享内存(Shared Memory)

共享内存允许两个或两个以上的进程共享一个给定的存储区。

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>int main() {int shmid;key_t key = 5678;char *data;shmid = shmget(key, 1024, IPC_CREAT | 0666);if (shmid < 0) {perror("shmget");exit(1);}data = shmat(shmid, NULL, 0);if (data == (char *)(-1)) {perror("shmat");exit(1);}memcpy(data, "这是共享内存的示例", 18);printf("写入: %s\n", data);return 0;
}
  1. 消息队列(Message Queue)

消息队列是消息的链接列表,存储在内核中并由消息队列标识符标识。

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>struct msg_buf {long msg_type;char msg_text[100];
};int main() {struct msg_buf msg;int msgid;key_t key;key = 1234;msgid = msgget(key, 0666 | IPC_CREAT);msg.msg_type = 1;printf("写入消息: ");fgets(msg.msg_text, 100, stdin);msgsnd(msgid, &msg, sizeof(msg), 0);return 0;
}
  1. 信号量(Semaphore)

信号量主要用于同步进程对公共资源的访问。

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/sem.h>int main() {key_t key = 1234;int semid;struct sembuf sb = {0, -1, 0};  // 设置信号量操作semid = semget(key, 1, 0666 | IPC_CREAT);// P操作if (semop(semid, &sb, 1) == -1) {perror("semop");exit(1);}printf("成功进入临界区\n");sb.sem_op = 1; // V操作if (semop(semid, &sb, 1) == -1) {perror("semop");exit(1);}return 0;
}
  1. 套接字(Sockets)

套接字允许在同一台计算机上的进程或不同计算机上的进程之间进行通信。

// TCP套接字示例: 简单服务器端
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen = sizeof(address);server_fd = socket(AF_INET, SOCK_STREAM, 0);address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(8080);bind(server_fd, (struct sockaddr *)&address, sizeof(address));listen(server_fd, 3);new_socket = accept(server_fd, (struct sockaddr *)&address, &addrlen);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot自定义全局异常处理器

文章目录 一、介绍二、实现1. 定义全局异常处理器2. 自定义异常类 三、使用四、疑问 一、介绍 Springboot框架提供两个注解帮助我们十分方便实现全局异常处理器以及自定义异常。 ControllerAdvice 或 RestControllerAdvice&#xff08;推荐&#xff09;ExceptionHandler 二、…

Python第 1 课 Python 介绍与安装

文章目录 第 1 课 Python 介绍与安装1.Python介绍1.1 面向对象概述1.2 Python 概述1.3 Python 特点 2.查看Python3.pyCharm 安装方法3.1 下载 pyCharm3.2 打开 pyCharm3.3 汉化 pyCharm3.4 pyCharm 的基本介绍和基本使用方法 第 1 课 Python 介绍与安装 1.Python介绍 1.1 面向…

Python爬虫库推荐

很多人学Python&#xff0c;都是从爬虫开始的&#xff0c;毕竟网上类似的资源很丰富&#xff0c;开源项目也非常多。 Python学习网络爬虫主要分3个大的版块&#xff1a; 抓取 &#xff0c; 分析 &#xff0c; 存储 当我们在浏览器中输入一个url后回车&#xff0c;后台会发生什…

消息中间件之八股面试回答篇:三、RabbitMQ如何解决消息堆积问题(100万条消息堆积)+RabbitMQ高可用性和强一致性机制+回答模板

RabbitMQ中的消息堆积问题 当生产者发送消息的速度超过了消费者处理消息的速度&#xff0c;就会导致队列中的消息堆积&#xff0c;直到队列存储消息达到上限。之后发送的消息就会成为死信&#xff0c;可能会被丢弃&#xff0c;这就是消息堆积问题。 解决消息堆积有三种种思路…

网络工程师必学知识:2、数据链路层-II型以太帧的封装

1.概述&#xff1a; 针对于链路层&#xff0c;华为官网IP报文格式大全里面包含了很多。如下图&#xff1a; 今天主要分析Ethernet II以太帧。 2.Frame Format&#xff1a; 12Byte&#xff08;inter frame gap&#xff09;|7B(同步码)|1B(定界符)|6B(DMAC)|6B(SMAC)|2B(Type)…

【Demo】基于CharacterController组件的角色控制

项目介绍 项目名称&#xff1a;Demo1 项目版本&#xff1a;1.0 游戏引擎&#xff1a;Unity2020.3.26f1c1 IDE&#xff1a;Visual Studio Code 关键词&#xff1a;Unity3D&#xff0c;CharacterController组件&#xff0c;角色控制&#xff0c;自定义按键&#xff0c;Scrip…

Rider 打开Unity项目 Project 全部显示 load failed

电脑自动更新&#xff0c;导致系统重启&#xff0c;第二天Rider打开Unity 工程&#xff0c;没有任何代码提示&#xff0c;字符串查找也失效。 现象&#xff1a; 1.所有的Project均显示laod failed。点击load failed。右侧信息显示Can not start process 2.选中解决方案进行Bui…

解决PyCharm的Terminal终端conda环境默认为base无法切换的问题

问题描述 在使用PyCharm的Terminal终端时&#xff0c;打开的默认环境为base。 在使用切换命令时&#xff0c;依旧无法解决。 解决方法 1、输入以下命令以查看conda的配置信息&#xff1a; conda config --show2、在输出中找到 auto_activate_base 的行&#xff0c;发现被…

IMX6ULL驱动学习——通过总线设备驱动模型点亮野火开发板小灯【参考韦东山老师教程】

参考&#xff1a;【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想&#xff08;学习设备树过渡部分&#xff09;-CSDN博客 韦东山课程&#xff1a;LED模板驱动程序的改造_总线设备驱动模型 我使用的开发板&#xff1a;野火imx6ull pro 欢迎大家一起讨论学习 实现了总线设…

uniapp 实现路由拦截,权限或者登录控制

背景&#xff1a; 项目需要判断token&#xff0c;即是否登录&#xff0c;登录之后权限 参考uni-app官方&#xff1a; 为了兼容其他端的跳转权限控制&#xff0c;uni-app并没有用vue router路由&#xff0c;而是内部实现一个类似此功能的钩子&#xff1a;拦截器&#xff0c;由…

数字图像处理(实践篇)三十三 OpenCV-Python从立体图像创建深度图实践

目录 一 方案 二 实践 双眼视觉是指人类使用两只眼睛同时观察同一场景,通过左右眼的视差来感知深度。左眼和右眼的视差是由于它们在空间中的位置不同而产生的,这种差异可以被大脑解读为物体的距离和深度。为了从立体图像构建深度图,找到两个图像之间的视差,可以初始化并创…

Java强训day7(选择题编程题)

选择题 public class Test01{private static int x 100;public static void main(String[] args) {Test01 hs1 new Test01();hs1.x;Test01 hs2 new Test01();hs2.x;hs1new Test01();hs1.x;Test01.x--;System.out.println("x"x);} }public class Test01{private …

倒排索引的构建与查询

倒排索引是信息检索的重要技术&#xff0c;本文将基于中文短信数据&#xff08;数据集可在本文所附资源处下载或点击此处链接下载&#xff09;&#xff0c;编程构建倒排索引并实现布尔查询。 1. 功能设计 用户输入查询&#xff0c;按下回车键&#xff0c;如果该查询作为单独的…

【Kafka】主题Topic详解

目录 主题的管理创建主题查看主题修改主题删除主题 增加分区分区副本的分配必要参数配置KafkaAdminClient应用功能操作示例 主题的管理 使用kafka-topics.sh脚本。 下面是使用脚本的一些选项 选项说明–config <String: namevalue>为创建的或修改的主题指定配置信息。…

Mybatis-Plus入门

Mybatis-Plus入门 MyBatis-Plus 官网&#xff1a;https://mp.baomidou.com/ 1、简介 MyBatis-Plus (简称 MP) 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、 提高效率而生。 https://github.com/baomidou/mybatis-p…

【Java】Spring注解开发

一、Spring注解开发 1 注解开发定义Bean对象【重点】 目的&#xff1a;xml配置Bean对象有些繁琐&#xff0c;使用注解简化Bean对象的定义 问题导入 问题1&#xff1a;使用什么标签进行Spring注解包扫描&#xff1f; 问题2&#xff1a;Component注解和Controller、Service、R…

Blender教程(基础)-初始用户界面-01

开始第一天的Blender学习、也是业余学习。希望记录下这一份学习的过程、并且分享给大家。今天带大家认识Blender这一款软件&#xff0c;先说说我为什么选择了Blender&#xff0c;我在软件市场找了好久&#xff0c;市场上其他雷同软件都是要么收费要么不好用&#xff0c;最终决定…

【Vitest】 Vitest测试框架的简单使用

简言 在了解vue源码的时候接触到了vitest测试框架,它的官网语言有中文&#xff0c;所以本篇只作简单的使用介绍。 Vitest官网 Vitest 旨在将自己定位为 Vite 项目的首选测试框架&#xff0c;即使对于不使用 Vite 的项目也是一个可靠的替代方案。它本身也兼容一些Jest的API用法…

1.28学习总结

队列&#xff1a; 1.求区间所有后缀最大值的位置&#xff08;单调队列&#xff09; 搜索&#xff1a; 1.天下第一&#xff08;记忆化&#xff09; 2.拯救oibh总部&#xff08;DFS连通性问题&#xff09; 3.国王的魔镜&#xff08;递归&#xff09; 4.回家&#xff08;BFS三维的…

AngularJS基础入门文档

引言&#xff1a; AngularJS是一个开源的JavaScript框架&#xff0c;用于构建动态Web应用程序。它提供了一套强大的工具和功能&#xff0c;使开发人员能够更轻松地构建交互性强、响应式的网页应用。本文将为您介绍AngularJS的基本概念和使用方法&#xff0c;帮助您快速入门并掌…