Linux进程5-进程通信常见的几种方式、信号概述及分类、kill函数及命令、语法介绍

news2025/4/22 12:59:06

目录

1.进程间通信概述

1.1进程通信的主要方式

1.2进程通信的核心对比

2.信号

2.1 信号的概述

2.1.1 信号的概念

2.2信号的核心特性

2.3信号的产生来源

2.4信号的处理流程

2.5关键系统调用与函数

2.6常见信号的分类及说明

2.6.1. 标准信号(Standard Signals)

2.6.2. 实时信号(Real-Time Signals)

2.6.3. 不可捕获/忽略的信号

2.6.4. 用户自定义信号

2.6.5. 调试与跟踪信号

2.6.6. 终端与作业控制信号

2.6.7. 系统与资源信号

2.7信号分类总结

3.kill函数

3.1 kill命令终端执行

3.1.1基本语法

3.1.1.1. 终止进程

3.1.1.2. 暂停与恢复进程

3.1.1.3. 自定义操作

3.1.1.4. 批量终止进程

3.1.2 kill终端运行程序


1.进程间通信概述

进程间通信(IPC:Inter Processes Communication), 进程是一个独立的资源分配单元,不同进程(这里所说的进程通常指的是用户进程)之 间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源(例如打开的 文件描述符)。 进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要进程间通信。
进程通信的核心目标:
  • 数据传输:进程间交换数据(如管道、套接字)。
  • 资源共享:多个进程共享同一资源(如共享内存、文件)。
  • 协调同步:控制进程执行顺序(如信号量、互斥锁)。
  • 事件通知:异步告知进程某事件发生(如信号)。

1.1进程通信的主要方式

根据通信原理和适用场景,IPC 可分为以下类别:

1. 基于文件的通信

  • 普通文件:多个进程读写同一文件(需同步机制)。
  • 内存映射文件(mmap):将文件映射到内存,多进程直接访问同一内存区域
  • 命名管道(FIFO):通过文件系统路径标识的管道,无关进程可通过路径名通信。

2. 基于内核的通信

  • 匿名管道(Pipe):父子进程间的单向通信,通过 | 或 pipe() 创建。
  • 消息队列(Message Queue):内核维护的链表结构,支持结构化消息(类型、优先级)。
  • 共享内存(Shared Memory):多个进程映射同一物理内存区域,速度最快,但需同步机制(如信号量)。
  • 信号量(Semaphore):控制对共享资源的访问,解决竞态条件(如 System V 或 POSIX 信号量)。
  • 信号(Signal):内核向进程发送异步事件通知(如 SIGTERM 终止进程)。

3. 基于网络的通信

  • 套接字(Socket)支持跨网络或本地进程通信(如 TCP/UDP 套接字、Unix 域套接字)。

4. 其他高级机制

  • RPC(远程过程调用):跨进程/机器的函数调用抽象。
  • DBus:Linux 桌面环境中的高级消息总线,用于进程间服务调用。

1.2进程通信的核心对比

机制方向数据量同步需求适用场景
匿名管道单向父子进程简单通信
命名管道单向无关进程顺序通信
消息队列双向结构化消息传递(异步)
共享内存双向必需高性能数据共享(需同步)
信号单向异步进程控制(如终止、挂起)
信号量无数据同步资源访问互斥
套接字双向可选跨网络/本地可靠通信
1.3进程间通信的实质:
系统只要创建一个进程,就会给当前进程分配4G的虚拟内存(32位操作系统),虚拟内存不是常说的内存条的空间,内存条的空间称之为物理内存,虚拟内存和物理内存之间存在映射关系。
4G的虚拟内存分为3G的用户空间(0~3G)和1G(3~4G)的内核空间 用户空间是进程所私有 的, 每一个进程的用户空间只能自己访问和使用 ,我们之前说的栈 区、堆区、数据区、代码区等都是用户空间的区域,内核空间是所有进程所公有的,也就意味着绝大多数进程间通信方式,本质就是对内核空间 的操作。

2.信号

2.1 信号的概述

2.1.1 信号的概念

 信号(Signal) 是操作系统内核向进程发送的异步事件通知机制,用于通知进程发生了特定事件(如用户中断、程序错误等)。它是进程间通信(IPC)中最轻量级的方式之一,常用于进程控制、错误处理和简单事件通知。

信号是软件中断 它是在软件层次上对中断机制的一种模拟。 信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。
信号可以 直接进行用户空间进程和内核空间进程的交互 ,内核进程可以利用它来通知用户空间进程发生了哪些系统事件。
每个信号的名字都以字符SIG开头。
每个信号和一个数字编码相对应,在头文件signum.h中,这些信号都被定义为正整数。
信号名定义路径:
终端输入:sudo find /usr/include -name "signum.h" 命令,查看signum.h的位置
signum.h中的信号:
在Linux下,要想查看这些信号和编码的对应关系,可使用命令: kill ­-l

2.2信号的核心特性

  1. 异步性:信号可能在任何时间点到达进程,打断其正常执行流程。
  2. 有限信息:仅传递信号编号(如 SIGINT),无法携带额外数据。
  3. 预定义类型:Linux 定义了一些标准信号(1~31 和 34~64),如:
    • SIGINT (2):终端中断(Ctrl+C)。
    • SIGKILL (9):强制终止进程(不可捕获或忽略)。
    • SIGSEGV (11):非法内存访问(段错误)。
    • SIGTERM (15):请求进程正常终止(优雅终止进程)。
    • SIGUSR1 (10) 和 SIGUSR2 (12):用户自定义信号。
  4. 处理方式:进程可选择忽略、捕获(执行处理函数)或执行默认操作。

2.3信号的产生来源

来源示例场景
用户输入终端按下 Ctrl+C(发送 SIGINT)。
内核事件进程访问非法内存(触发 SIGSEGV)、子进程终止(发送 SIGCHLD)。
其他进程通过 kill() 或 kill 命令发送信号(如 kill -9 PID 发送 SIGKILL)。
程序自身调用 raise() 或 abort() 触发信号(如 SIGABRT)。

2.4信号的处理流程

  1. 信号产生:由内核、用户或其他进程触发。
  2. 信号递送:内核将信号放入目标进程的待处理信号队列
  3. 信号处理:进程在用户态内核态切换时检查待处理信号,并根据注册的处理方式响应:
    • 默认行为(如终止、暂停、忽略)。
    • 捕获信号:执行用户自定义的信号处理函数。
    • 忽略信号SIGKILL 和 SIGSTOP 除外)。

2.5关键系统调用与函数

  1. 发送信号
    • kill(pid, sig):向指定进程发送信号。
    • raise(sig):向当前进程发送信号。
    • sigqueue(pid, sig, value):发送信号并附带额外数据(需配合 sigaction 使用)。
  2. 处理信号
    • signal(sig, handler):简单注册信号处理函数(不推荐,可能不可靠)。
    • sigaction(sig, act, oldact):更安全的信号处理配置(推荐使用)。
  3. 阻塞信号
    • sigprocmask():屏蔽或解除屏蔽信号,防止处理函数被中断。
  4. 等待信号
    • pause():挂起进程直到收到信号。
    • sigsuspend():临时修改信号掩码并等待信号。

2.6常见信号的分类及说明

2.6.1. 标准信号(Standard Signals)

编号范围:1~31(即 SIGRTMIN 之前的信号),这些是传统的 UNIX 信号,功能固定。

核心分类

类型信号默认行为典型触发场景
进程终止SIGTERM (15)终止进程kill 默认发送,允许优雅退出
SIGKILL (9)立即终止进程kill -9 强制终止,不可捕获或忽略
SIGQUIT (3)终止并生成 core 文件终端按下 Ctrl+\
用户交互SIGINT (2)终止进程终端按下 Ctrl+C
SIGTSTP (20)暂停进程(可恢复)终端按下 Ctrl+Z
程序错误SIGSEGV (11)终止并生成 core 文件非法内存访问(段错误)
SIGFPE (8)终止并生成 core 文件算术错误(如除零)
SIGILL (4)终止并生成 core 文件非法指令(如执行损坏的二进制文件)
进程控制SIGCHLD (17)忽略子进程终止或状态变化
SIGCONT (18)恢复进程运行用于恢复被暂停的进程(如 fg 命令)
SIGSTOP (19)立即暂停进程不可捕获或忽略,用于作业控制

2.6.2. 实时信号(Real-Time Signals)

编号范围:34~64(即 SIGRTMIN 到 SIGRTMAX),支持队列化携带附加数据

  • 特点
    • 可排队:同一信号多次发送不会丢失(标准信号可能合并为一次)。
    • 可携带数据:通过 sigqueue() 发送时附加 sival_int 或 sival_ptr
  • 用途:高可靠性事件通知(如自定义通信)。

2.6.3. 不可捕获/忽略的信号

  • SIGKILL (9) 和 SIGSTOP (19):
    • 内核直接处理,进程无法修改其行为(无法捕获或忽略)
    • 用于强制终止(SIGKILL)或立即暂停(SIGSTOP)进程。

2.6.4. 用户自定义信号

  • SIGUSR1 (10) 和 SIGUSR2 (12):
    • 默认行为是终止进程,但通常由程序重定义为自定义逻辑(如重载配置、触发备份)。
    • 示例:

      bash

      # 发送 SIGUSR1 到进程 1234
      kill -USR1 1234
      

2.6.5. 调试与跟踪信号

信号默认行为用途
SIGTRAP (5)终止并生成 core 文件调试断点触发(如 gdb 单步执行)
SIGABRT (6)终止并生成 core 文件程序调用 abort() 主动终止(断言失败)

2.6.6. 终端与作业控制信号

信号默认行为触发场景
SIGHUP (1)终止进程终端断开连接(常用于通知守护进程重载配置)
SIGWINCH (28)忽略终端窗口大小改变(如 vim 动态调整界面)

2.6.7. 系统与资源信号

信号默认行为触发场景
SIGPIPE (13)终止进程写入无读端的管道(如 `管道
SIGALRM (14)终止进程定时器到期(alarm() 或 setitimer()
SIGXCPU (24)终止进程进程超出 CPU 时间限制
SIGXFSZ (25)终止进程文件大小超出限制

2.7信号分类总结

分类代表信号核心用途
进程终止SIGTERMSIGKILLSIGQUIT终止或强制终止进程
用户交互SIGINTSIGTSTP终端控制(暂停/终止)
程序错误SIGSEGVSIGFPESIGILL处理非法操作或崩溃
进程控制SIGCHLDSIGCONTSIGSTOP管理子进程或作业控制
实时通信SIGRTMIN~SIGRTMAX高可靠性事件通知(支持队列化和数据携带)
调试与资源SIGTRAPSIGXCPUSIGALRM调试、资源超限或定时任务

3.kill函数

函数原型:

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signum);

功能:
给指定进程发送信号。

参数:
pid:详见下页
signum:信号的编号

返回值:
成功返回 0,失败返回 -1。

pid 的取值有 4 种情况:
pid>0: 将信号传送给进程 ID 为 pid 的进程。
pid=0: 将信号传送给当前进程所在进程组中的所有进程。
pid=-1: 将信号传送给系统内所有的进程。
pid<-1: 将信号传给指定进程组的所有进程。这个进程组号等于 pid 的绝对值。

程序1:未加入kill函数

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
    pid_t pid;
	
    pid = fork();//通过fork函数创建一个子进程
    if(pid < 0)
    {
        perror("fail to fork");//创建失败
        exit(1);//退出
    }
    else if(pid > 0) //父进程的代码区
    {
    	   int i = 0;
        while(1)
        {
            printf("父进程正在运行 %d 次\n", i);
		  i++;
            sleep(1);
        }
        printf("父进程 运行 末尾 \n");
    }
    else //子进程的代码区 
    {
        printf("子进程正在运行 ... \n");

       printf("子进程 运行 末尾 \n");
    }

	return 0;
}

运行结果:

程序2:加入kill函数

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
    pid_t pid;
	
    pid = fork();//通过fork函数创建一个子进程
    if(pid < 0)
    {
        perror("fail to fork");//创建失败
        exit(1);//退出
    }
    else if(pid > 0) //父进程的代码区
    {
    	   int i = 0;
        while(1)
        {
            printf("父进程正在运行 %d 次\n", i);
		  i++;
            sleep(1);
        }
        printf("父进程 运行 末尾 \n");
    }
    else //子进程的代码区 
    {
        printf("子进程正在运行 ... \n");

        //子进程在3秒之后,让父进程退出
        sleep(3);

        //使用kill给父进程发送信号,然后父进程接收到信号后直接退出就可以了
        // int kill(pid_t pid, int signum);
        kill(getppid(), SIGINT);// SIGINT 终止进程(终端按下 Ctrl+C)
        //kill(getppid(), SIGKILL);
    // SIGKILL 立即终止进程(kill -9 强制终止,不可捕获或忽略)
       printf("子进程 运行 末尾 \n");
    }

	return 0;
}

运行结果:

3.1 kill命令终端执行

kill 是 Linux/Unix 系统中用于向进程发送信号的命令行工具,核心用途是控制进程的行为(如终止、暂停、恢复或自定义操作)。

3.1.1基本语法

kill [选项] <信号> <进程ID>
kill [选项] -<信号名> <进程ID>

常用选项:

-l:列出所有支持的信号名称和编号。

-s <信号>:指定要发送的信号(默认是 SIGTERM)。

信号表示方式:

信号名(如 SIGTERM、SIGKILL)。

信号编号(如 9 对应 SIGKILL)。

3.1.1.1. 终止进程
  • 默认行为:默认发送 SIGTERM(允许进程优雅退出)。

    kill 1234          # 发送 SIGTERM 到 PID=1234 的进程
    kill -15 1234      # 同上(SIGTERM 的编号是 15)
    
  • 强制终止:发送 SIGKILL(立即终止,不可被捕获或忽略)。

    kill -9 1234       # 强制终止 PID=1234 的进程
    kill -SIGKILL 1234 # 同上(使用信号名)
    kill -s SIGKILL 1234  # 同上(使用信号名)
    
3.1.1.2. 暂停与恢复进程
  • 暂停进程:发送 SIGSTOP(立即暂停进程)。

    kill -SIGSTOP 1234
    
  • 恢复进程:发送 SIGCONT(继续运行被暂停的进程)。

    kill -SIGCONT 1234
    
3.1.1.3. 自定义操作
  • 触发用户定义逻辑:使用 SIGUSR1 或 SIGUSR2
    kill -SIGUSR1 1234 # 通知进程执行自定义操作(如重载配置)
    
3.1.1.4. 批量终止进程
  • 终止同一进程组:使用负 PID(如 -1234 终止进程组 1234)。
    kill -9 -1234      # 强制终止进程组 1234 的所有进程

3.1.2 kill终端运行程序

程序:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
    pid_t pid;
	
    pid = fork();//通过fork函数创建一个子进程
    if(pid < 0)
    {
        perror("fail to fork");//创建失败
        exit(1);//退出
    }
    else if(pid > 0) //父进程的代码区
    {
    	   int i = 0;
        while(1)
        {
            printf("父进程正在运行 %d 次\n", i);
		  i++;
            sleep(3);
        }
        printf("父进程 运行 末尾 \n");
    }
    else //子进程的代码区 
    {
        printf("子进程正在运行 ... \n");

       printf("子进程 运行 末尾 \n");
    }

	return 0;
}

运行结果:若无kill函数,父进程每隔3秒打印一次。

(1)终端1运行./a.out ,在终端2执行kill命令退出当前进程。

终端2先执行 ps -ajx | grep a.out 命令,ps ajx //前三列分别为 ppid  pid  pgid ,

在根据pid执行kill -9 pid号 命令。

(2)终端1运行./a.out ,在终端2执行kill命令退出当前进程。

终端2先执行 ps -ajx | grep a.out 命令,ps ajx //前三列分别为 ppid  pid  pgid ,

在根据pid执行 kill -s SIGKILL pid号 命令。

(3)终端1运行./a.out ,在终端2执行kill命令退出当前进程。

终端2先执行 ps -ajx | grep a.out 命令,ps ajx //前三列分别为 ppid  pid  pgid ,

在根据pid执行 kill  -SIGKILL pid号 命令。

(4)终端1运行./a.out ,在终端2执行kill命令退出当前进程。

终端2先执行 ps -ajx | grep a.out 命令,ps ajx //前三列分别为 ppid  pid  pgid ,

在根据pid执行 kill  pid号 命令。(kill 默认发送 SIGTERM(允许进程优雅退出))

 (5)终端1运行./a.out ,在终端2执行kill命令退出当前进程。

终端2先执行 ps -ajx | grep a.out 命令,ps ajx //前三列分别为 ppid  pid  pgid ,

在根据pid执行 kill SIGKILL  pid号 命令。

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

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

相关文章

[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析

[架构之美]一键服务管理大师&#xff1a;Ubuntu智能服务停止与清理脚本深度解析 服务展示&#xff1a; 运行脚本&#xff1a; 剩余服务&#xff1a; 一、脚本设计背景与核心价值 在Linux服务器运维中&#xff0c;服务管理是日常操作的重要环节。本文介绍的智能服务管理脚本&a…

C++算法(10):二叉树的高度与深度,(C++代码实战)

引言 在二叉树的相关算法中&#xff0c;高度&#xff08;Height&#xff09;和深度&#xff08;Depth&#xff09;是两个容易混淆的概念。本文通过示例和代码实现&#xff0c;帮助读者清晰区分二者的区别。 定义与区别 属性定义计算方式深度从根节点到该节点的边数根节点深度…

Psychology 101 期末测验(附答案)

欢呼 啦啦啦~啦啦啦~♪(^∇^*) 终于考过啦~ 开心(*^▽^*) 撒花✿✿ヽ(▽)ノ✿ |必须晒下证书: 判卷 记录下判卷,还是错了几道,填空题2道压根填不上。惭愧~ 答案我隐藏了,实在想不出答案的朋友可以留言,不定时回复。 建议还是认认真真的学习~认认真真的考试~,知识就…

安全协议分析概述

一、概念 安全协议&#xff08;security protocol&#xff09;&#xff0c;又称密码协议。是以密码学为基础的消息交换协议&#xff0c;在网络中提供各种安全服务。&#xff08;为解决网络中的现实问题、满足安全需求&#xff09; 1.1 一些名词 那什么是协议呢&#xff1f; …

基础学习:(7)nanoGPT 剩下的细节

文章目录 前言3 继续巴拉结构3.1 encode 和 embedding3.2 全局layernorm3.3 lm_head(language modeling) 和 softmax3.4 softmax 和 linear 之间的 temperature和topk3.5 weight tying 前言 在 基础学习&#xff1a;&#xff08;6&#xff09;中, 在运行和训练代码基础上,向代…

Spark-SQL连接Hive总结及实验

一、核心模式与配置要点 1. 内嵌Hive 无需额外配置&#xff0c;直接使用&#xff0c;但生产环境中几乎不使用。 2. 外部Hive&#xff08;spark-shell连接&#xff09; 配置文件&#xff1a;将hive-site.xml&#xff08;修改数据库连接为node01&#xff09;、core-site.xml、…

Linux Wlan-四次握手(eapol)框架流程

协议基础 基于 IEEE 802.1X 标准实现的协议 抓包基础 使用上一章文章的TPLINK wn722n v1网卡在2.4G 频段抓包&#xff08;v2、v3是不支持混杂模式的&#xff09; eapol的四个交互流程 根据不同的认证模式不同&#xff0c;两者的Auth流程有所不同&#xff0c;但是握手流程基…

web组件和http协议

1.web组件 2.自定义元素 3.影子DOM 4.HTML模板 5.http协议 6.tcp ip协议

软件工程师中级考试-上午知识点总结(下)

6. 知识产权和标准化 软件著作权客体&#xff1a;指的是受软件著作权保护的对象&#xff0c;即计算机程序和相关文档。知识产权具有严格的地域性。不受保护期限制&#xff1a;著名权、修改权、保护作品完整权&#xff1b;注意的是&#xff0c;发表权受保护期限制。专利权在期满…

IO流--字节流详解

IO流 用于读写数据的&#xff08;可以读写文件&#xff0c;或网络中的数据&#xff09; 概述&#xff1a; I指 Input&#xff0c;称为输入流&#xff1a;负责从磁盘或网络上将数据读到内存中去 O指Output&#xff0c;称为输出流&#xff0c;负责写数据出去到网络或磁盘上 因…

Cesium学习笔记——dem/tif地形的分块与加载

前言 在Cesium的学习中&#xff0c;学会读文档十分重要&#xff01;&#xff01;&#xff01;在这里附上Cesium中英文文档1.117。 在Cesium项目中&#xff0c;在平坦坦地球中加入三维地形不仅可以增强真实感与可视化效果&#xff0c;还可以​​提升用户体验与交互性&#xff0c…

Java排序算法百科全书:原理、实现与实战指南

一、排序算法全景视图 1. 算法分类体系 graph TDA[排序算法] --> B[比较排序]A --> C[非比较排序]B --> B1[基本排序]B1 --> B11[冒泡排序]B1 --> B12[选择排序]B1 --> B13[插入排序]B --> B2[高效排序]B2 --> B21[快速排序]B2 --> B22[归并排序]B…

开源脚本分享:用matlab处理ltspice生成的.raw双脉冲数据

Author :PNJIE DATE: 2025/04/21 V0.0 前言 该项目旨在使用Matlab处理LTspice的.raw文件&#xff0c;包括动态计算和绘图&#xff0c;部分脚本基于LTspice2Matlab项目&#xff1a; PeterFeicht/ltspice2matlab: LTspice2Matlab - 将LTspice数据导入MATLAB github地址&#x…

(二)mac中Grafana监控Linux上的MySQL(Mysqld_exporter)

框架&#xff1a;GrafanaPrometheusMysqld_exporter 一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装&#xff08;mac&#xff09;-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录…

Github中项目的公开漏洞合集

前言 最近在搜CVE的时候&#xff0c;意外发现了GitHub Security Advisories。 可能对一些人来说&#xff0c;已经是老东西了。但我还是第一次见到。 觉得挺好用的&#xff0c;就分享出来。 GitHub Security Advisories GitHub Security Advisories 是 GitHub 提供的一项重要…

蚂蚁全媒体总编刘鑫炜再添新职,出任共工新闻社新媒体研究院院长

2025年4月18日&#xff0c;共工新闻社正式宣布聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院院长。此次任命标志着刘鑫炜在新媒体领域的专业能力与行业贡献再次获得权威机构认可。 刘鑫炜深耕新媒体领域多年&#xff0c;曾担任中国新闻传媒集团新媒体研究院院长、蚂蚁全媒体总编等职…

吴恩达强化学习复盘(2)K-Means初始化|K的选择|算法优化

K-Means初始化 K-Means 算法的第一步是随机选择位置作为初始聚类中心&#xff08;new one through newk&#xff09;&#xff0c;但如何进行随机猜测是需要探讨的问题。一般需要多次尝试初始猜测&#xff0c;以期望找到更好的聚类结果。 K 值选择及初始聚类中心选取方法 K 值…

SQL优化案例分享 | PawSQL 近日推出 Lateral Join 重写优化算法

一、Lateral 查询语法介绍 Lateral 查询是SQL中的一种连接方式&#xff0c;它允许FROM子句中的子查询引用同一FROM子句中前面的表的列。虽然这种特性提供了强大的表达能力&#xff0c;但在某些场景下可能导致性能问题。PawSQL优化器近日实现了一种针对特定类型Lateral Join的重…

电子电器架构 ---软件定义汽车的电子/电气(E/E)架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

ONLYOFFICE协作空间3.1发布:虚拟数据房间中基于角色的表单填写、房间模板、改进访客管理等

全新升级的 ONLYOFFICE 协作空间有着约 40 项新功能和改进&#xff0c;将您的文档协作和管理体验提升到全新高度。阅读本文&#xff0c;了解所有优化功能。 关于 ONLYOFFICE ONLYOFFICE 是一个国际开源项目&#xff0c;专注于高级和安全的文档处理&#xff0c;可提供文本文档、…