嵌入式入门Day32

IO day8

进程通信

Linux系统提供了多种进程之间的通信方式

例如:无名管道,有名管道,信号等

  1. 如果是同一进程下的多个线程,共享资源,所以线程之间的通信只需要注意互斥和同步即可。
  2. 如果是多个进程。由于进程之间不共享资源,所以进程间的通信需要用到,系统提供的内核空间。

无名管道

  1. 本质也是一个内核空间的文件,存储在内存中,读写数据都是一次性的
  2. 无名管道写入数据后,一旦读出数据,数据就消失了
  3. 无名管道,一旦打开,就出现读端和写端,如果进行读取数据,就要先关闭写端,如果想要写数据,就要先关闭读端
  4. 无名管道工作原理是半双工,也就是同一时刻只能是A写B读,或者A读B写
  5. 无名管道只能进行亲缘进程间的通信
  6. 管道文件相关的函数属于文件IO部分,只能使用文件IO读写
  7. 管道的读写端属于文件描述符,也遵循最小未分配原则

单工:只能是A向B发信息,B不能向A发信息。

半双工:同一时刻只能A向B发信息,或者B向A发信息。

全双工:同一时刻AB都是收发信息

无名管道API

c 复制代码
#include <unistd.h>

       int pipe(int pipefd[2]);
       功能:创建一个无名管道.pipefd[0]读端 pipefd[1]:写端
       参数:文件描述符数组
       返回值:成功返回0,失败返回-1,并置位错误码。
       eg:
       int pipefd[2];
       if(pipe(pipefd)==-1)
       {
           perror("pipe");
           return -1;       
       }
  1. 当读端存在时,有多少就写多少,写够2^16K为止
  2. 当写端存在时,有多少就读多少,读完为止会在read处阻塞
  3. 当读端不存在,写入管道,会导致管道破裂
  4. 当写端不存在时,有多少就读多少,读完为止不会在read处阻塞

有名管道

  1. 有名字的管道,相对于无名管道,可以进程非亲缘进程间的通信
  2. 有名管道写入一次读取一次

API

c 复制代码
 #include <sys/types.h>
       #include <sys/stat.h>

       int mkfifo(const char *pathname, mode_t mode);
        功能:创建一个有名管道用于非亲缘进程间的通信
        参数1:有名管道名
        参数2:创建时的权限。
        返回值:成功返回0,失败返回-1,并置位错误码

信号

  1. 进程间除了管道之外还可以使用信号通信
  2. 中断是硬件的操作,信号是模拟硬件的中断
  3. 信号可以由内核发送给进程,可以由用户发送给进程,还可以由进程发送给进程
  4. 信号的发送接收属于异步通信,也就是各个进程之间互不影响
  5. 信号的处理方式三种:默认,忽略,捕获(由用户自定义处理方式
    1. SIGKILL,SIGSTOP既不能忽略也不能捕获,只能执行
  6. 信号种类可以使用 kill -l查看
  7. 信号的监听是从运行signal开始随时进行的,接收到相应信号将会立刻响应

API

c 复制代码
#include <signal.h>

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);
       功能:信号处理函数,忽略,默认和捕获操作。
       参数1:信号号
       参数2:
       SIG_IGN:忽略信号,不执行任何的操作。
       SIG_DFL:默认信号,执行信号原始的操作。
       自定义函数:捕获,某个信号,捕获的信号处理方式由程序员决定。
       返回值:成功返回前一个信号号,失败返回SIG_ERR, 并置位错误码

alarm

c 复制代码
#include <unistd.h>

       unsigned int alarm(unsigned int seconds);
       功能:设置定时时间,时间到了内核会向调用进程发送SIGALRM信号
       如果第二次设置了定时时间,那么alarm函数返回的是上一次剩余的秒数。
       参数:设置的秒数。
       返回值:成功返回上一次预定的剩余秒数,如果没有上一次预定的秒数返回0
相关推荐
2601_949146537 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
知南x9 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
Fcy6489 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
2的n次方_11 小时前
Runtime 执行提交机制:NPU 硬件队列的管理与任务原子化下发
c语言·开发语言
凡人叶枫11 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
凡人叶枫13 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
傻乐u兔14 小时前
C语言进阶————指针3
c语言·开发语言
CodeSheep程序羊15 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
I'mChloe15 小时前
PTO-ISA 深度解析:PyPTO 范式生成的底层指令集与 NPU 算子执行的硬件映射
c语言·开发语言
2的n次方_16 小时前
Runtime 内存管理深化:推理批处理下的内存复用与生命周期精细控制
c语言·网络·架构