嵌入式学习第二十三天!(进程间通信)

进程间的通信:

  1. 管道

  2. 信号

  3. 消息队列

  4. 共享内存

  5. 信号灯

  6. 套接字

1. 管道:

  1. 无名管道

      无名管道只能用于具有亲缘关系的进程间通信

        原因:无名管道没有名字,所有找不到管道的具体位置,那么在创建子进程前,先创建无名管道,那么子进程就会继承父进程所创建的无名管道,那么就可以实现,父子进程间的通信。

      1. pipe:
 int pipe(int pipefd[2]);

        功能:创建一个无名管道

        参数:

            pipefd[0]:读管道文件描述符
            pipefd[1]:写管道文件描述符

        返回值:

            成功返回0 
            失败返回-1

      2. 无名管道特性:
            1. 管道中至少有一个写端:

                读取数据时,如果管道中有数据直接读取;管道中没有数据,阻塞等待直到有数据写入读出,继续向后执行

            2. 管道中没有写端:

                读取数据时,如果管道中有数据直接读取;管道中没有数据,不阻塞等待直接向下执行

            3. 管道中至少有一个读端:

                写入数据时,如果管道中没有存满(64K),则直接写入;管道中如果存满,则阻塞等待,直到有数据读出,才能继续写入

            4. 管道中没有读端:

                写入数据时,会产生管道破裂错误,导致程序崩溃

  2. 有名管道:

      打开管道文件  ->  读写管道文件  ->  关闭管道文件

      注意:有名管道必须读写两端同时加入才能继续向下执行

      1. mkfifo:
int mkfifo(const char *pathname, mode_t mode);

        功能:创建一个管道文件

        参数:

            pathname:管道文件路径
            mode:权限

        返回值:

            成功返回0 
            失败返回-1

      练习:

        编写两个进程,A、B ,A与B可以互相收发消息,并打印出对方的消息

clientA.c:

#include "head.h"int fatob = 0;
int fbtoa = 0;
pthread_t tid_atob;
pthread_t tid_btoa;void *thread_AtoB(void *arg)
{while(1){char tmpbuff[4096] = {0};memset(tmpbuff, 0, sizeof(tmpbuff));gets(tmpbuff);write(fatob, tmpbuff, strlen(tmpbuff));if(!strcmp(tmpbuff, ".quit")){break;}}pthread_cancel(tid_btoa);return NULL;
}void *thread_BtoA(void *arg)
{while(1){char tmpbuff[4096] = {0};memset(tmpbuff, 0, sizeof(tmpbuff));read(fbtoa, tmpbuff, sizeof(tmpbuff));printf("RECV:%s\n", tmpbuff);if(!strcmp(tmpbuff, ".quit")){break;}}pthread_cancel(tid_atob);return NULL;
}int main(void)
{mkfifo("/tmp/AtoB", 0777);mkfifo("/tmp/BtoA", 0777);fatob = open("/tmp/AtoB", O_WRONLY);if(fatob == -1){perror("fail to open");return -1;}fbtoa = open("/tmp/BtoA", O_RDONLY);if(fbtoa == -1){perror("fail to open");return -1;}pthread_create(&tid_atob, NULL, thread_AtoB, NULL);pthread_create(&tid_btoa, NULL, thread_BtoA, NULL);pthread_join(tid_atob, NULL);pthread_join(tid_btoa, NULL);close(fatob);close(fbtoa);return 0;
}

clientB.c:

#include "head.h"int fatob;
int fbtoa;
pthread_t tid_atob;
pthread_t tid_btoa;void *thread_AtoB(void *arg)
{char tmpbuff[4096] = {0};while(1){memset(tmpbuff, 0, sizeof(tmpbuff));read(fatob, tmpbuff, sizeof(tmpbuff));printf("RECV: %s\n", tmpbuff);if(!strcmp(tmpbuff, ".quit")){break;}}pthread_cancel(tid_btoa);return NULL;
}void *thread_BtoA(void *arg)
{char tmpbuff[4096] = {0};while(1){memset(tmpbuff, 0, sizeof(tmpbuff));gets(tmpbuff);write(fbtoa, tmpbuff, strlen(tmpbuff));if(!strcmp(tmpbuff, ".quit")){break;}}pthread_cancel(tid_atob);return NULL;}int main(void)
{mkfifo("/tmp/AtoB", 0777);mkfifo("/tmp/BtoA", 0777);fatob = open("/tmp/AtoB", O_RDONLY);if(fatob == -1){perror("fail to open");return -1;}fbtoa = open("/tmp/BtoA", O_WRONLY);if(fbtoa == -1){perror("fail to open");return -1;}pthread_create(&tid_atob, NULL, thread_AtoB, NULL);pthread_create(&tid_btoa, NULL, thread_BtoA, NULL);pthread_join(tid_atob, NULL);pthread_join(tid_btoa, NULL);close(fatob);close(fbtoa);return 0;}

2. 信号:

      信号用来实现内核层和用户信息的交互,也可以用来实现进程间通信

      1. 信号的种类:

          利用kill -l查看所有信号的种类

      2. 信号处理方式:

        1. 缺省:

            按照系统默认的方式处理

        2. 忽略:

            不响应信号

        3. 捕捉:

            按照自定义方式处理信号

        4. 注意:

            1. 9号信号SIGKILL和19号信号SIGSTOP,这两个信号不能被忽略和捕捉

            2. 以下三个信号可以从键盘输入:

                SIGINT:ctrl + c 
                SIGQUIT:ctrl + \
                SIGTSTP:ctrl + z

        5. signal:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

            功能:改变信号的处理方式

            参数:

                signum:信号的编号
                handler:信号的处理方式

                    SIG_IGN      忽略处理
                    SIG_DFL      缺省处理
                    函数首地址   捕捉处理

            返回值:

                成功返回之前处理函数的首地址
                失败返回SIG_ERR 

作业:

        1. 编写一个进程循环执行while

                当按下 SIGINT(ctrl + c) 打印SIGINT信号来了

                当按下 SIGQUIT(ctrl + \) 打印SIGQUIT信号来了

                当按下 SIGTSTP(ctrl + z) 打印SIGTSTP信号来了

        2. 1021 个位数统计 - PAT (Basic Level) Practice (中文) (pintia.cn)

#include <stdio.h>int PrintDigit(char *pnum)
{int digit[10] = {0};int i = 0;while(*pnum != '\0'){digit[*pnum - '0']++;pnum++;}for(i = 0; i < 10; i++){if(digit[i] != 0){printf("%d:%d\n", i, digit[i]);}}return 0;
}int main(void)
{char number[1000] = {0};gets(number);PrintDigit(number);return 0;}

        3. 1014 福尔摩斯的约会 - PAT (Basic Level) Practice (中文) (pintia.cn)

#include <stdio.h>
#include <string.h>int GetMousse(char (*pmos)[64], int n)
{int i = 0;for(i = 0; i < n; i++){scanf("%s", pmos[i]);}return 0;
}int PrintfDecode(char (*pmos)[64], int n, char *pwd)
{int i = 0;char *ptmp1 = NULL;char *ptmp2 = NULL;char *day[7] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};ptmp1 = pmos[0];ptmp2 = pmos[1];//找寻星期几while(*ptmp1 != '\0' && *ptmp2 != '\0'){if(*ptmp1 == *ptmp2 && *ptmp1 >= 'A' && *ptmp1 <= 'Z'){break;}ptmp1++;ptmp2++;}sprintf(pwd, "%s", day[*ptmp1 - 'A']);//找寻几点ptmp1++;ptmp2++;while(*ptmp1 != '\0' && *ptmp2 != '\0'){if(*ptmp1 == *ptmp2){break;}ptmp1++;ptmp2++;}if(*ptmp1 >= 'A' && *ptmp1 <= 'Z'){sprintf(pwd, "%s %d", pwd, *ptmp1 - 'A' + 10);}else{sprintf(pwd, "%s %d", pwd, *ptmp1 - '0');}ptmp1 = pmos[2];ptmp2 = pmos[3];//找寻分钟while(*ptmp1 != '\0' && *ptmp2 != '\0'){if(*ptmp1 == *ptmp2 && ((*ptmp1 >= 'A' && *ptmp1 <= 'Z') || (*ptmp1 >= 'a' && *ptmp1 <= 'z'))){break;}ptmp1++;ptmp2++;}sprintf(pwd, "%s:%02ld", pwd, ptmp1 - pmos[2]);return 0;
}int main(void)
{char mousse[4][64] = {0};char passwd[64] = {0};GetMousse(mousse, 4);PrintfDecode(mousse, 4, passwd);printf("%s\n", passwd);return 0;
}

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

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

相关文章

蓝牙耳机和笔记本电脑配对连接上了,播放设备里没有显示蓝牙耳机这个设备,选不了输出设备

环境&#xff1a; WIN10 杂牌蓝牙耳机6s 问题描述&#xff1a; 蓝牙耳机和笔记本电脑配对连接上了&#xff0c;播放设备里没有显示蓝牙耳机这个设备&#xff0c;选不了输出设备 解决方案&#xff1a; 1.打开设备和打印机&#xff0c;找到这个设备 2.选中这个设备&#…

Tomcat源码解析(二): Bootstrap和Catalina

Tomcat源码系列文章 Tomcat源码解析(一)&#xff1a; Tomcat整体架构 Tomcat源码解析(二)&#xff1a; Bootstrap和Catalina 目录 一、基础组件1、Lifecycle生命周期顶级接口2、组件的默认实现 二、启动类Bootstrap1、main2、init3、load与start 三、加载Catalina1、load2、s…

xss过waf的小姿势

今天看大佬的视频学到了几个操作 首先是拆分发可以用self将被过滤的函数进行拆分 如下图我用self将alert拆分成两段依然成功执行 然后学习另一种姿势 <svg id"YWxlcnQoIlhTUyIp"><img src1 οnerrοr"window[eval](atob(document.getElementsByTagNa…

深入理解Java泛型及其在实际编程中的应用

第1章&#xff1a;泛型的起源与重要性 大家好&#xff0c;我是小黑&#xff0c;在Java里&#xff0c;泛型&#xff08;Generics&#xff09;是一种不可或缺的特性&#xff0c;它允许咱们在编码时使用类型&#xff08;Type&#xff09;作为参数。这听起来可能有点绕&#xff0c…

单细胞Seurat - 细胞聚类(3)

本系列持续更新Seurat单细胞分析教程&#xff0c;欢迎关注&#xff01; 维度确定 为了克服 scRNA-seq 数据的任何单个特征中广泛的技术噪音&#xff0c;Seurat 根据 PCA 分数对细胞进行聚类&#xff0c;每个 PC 本质上代表一个“元特征”&#xff0c;它结合了相关特征集的信息。…

【网站项目】424学报稿件管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

ModStartCMS v8.1.0 图片前端压缩,抖音授权登录

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

[LeetCode]143.重排链表

143. 重排链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/reorder-list/description/ 题目 示例 解题思路 寻找链表中点 链表逆序 合并链表 注意到目标链表即为将原链表的左半端和反转后的右半端合并后的结果。 这样我们的任务即可划分为三步&a…

React入门之React_使用es5和es6语法渲染和添加class

React入门 //react的核心库 <script src"https://cdn.jsdelivr.net/npm/react17/umd/react.development.js"></script> //react操作dom的核心库&#xff0c;类似于jquery <script src"https://cdn.jsdelivr.net/npm/react-dom17/umd/react-dom.…

微信干货知识分享:自动回复

信息太多回复太慢 回复新好友不及时 号太多&#xff0c;携带多个手机太重 今天给大家分享一下微信的隐藏功能 自动通过好友 有新的好友请求时&#xff0c;系统会自动通过好友&#xff0c;以免处理其他工作时错过客户。 通过好友自动回复 当微信号在系统登录&#xff0c;被动…

adb下载安装及使用教程

adb下载安装及使用教程 一、ADB的介绍1.ADB是什么&#xff1f;2.内容简介3.ADB常用命令1. ADB查看设备2. ADB安装软件3. ADB卸载软件4. ADB登录设备shell5. ADB从电脑上发送文件到设备6. ADB从设备上下载文件到电脑7. ADB显示帮助信息 4.为什么要用ADB 二、ADB的下载1.Windows版…

深度学习 精选笔记(7)前向传播、反向传播和计算图

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…