5分钟彻底解决Windows程序运行库问题:VisualCppRedist AIO终极指南
2026/7/17 14:19:21
信号是 Linux 中用于异步通信、通知机制、处理随机事件的轻量级 IPC 方式,比如进程终止、异常通知等。
handle2);Linux 系统定义了多个信号,每个信号有其默认处理动作(可通过man 7 signal查看)。常见信号及默认行为如下:
| 信号名 | 取值 | 动作 | 说明 |
|---|---|---|---|
| SIGHUP | 1 | Term | 控制终端挂起 |
| SIGINT | 2 | Term | 键盘中断(Ctrl+C) |
| SIGQUIT | 3 | Core | 键盘退出(Ctrl+\),并生成 core dump |
| SIGILL | 4 | Core | 非法指令 |
| SIGABRT | 6 | Core | 进程调用abort()触发 |
| SIGKILL | 9 | Term | 强制终止进程(无法捕获 / 阻塞 / 忽略) |
| SIGSEGV | 11 | Core | 段错误(非法内存访问) |
| SIGPIPE | 13 | Term | 向无读者的管道写数据 |
| SIGALRM | 14 | Term | 定时器信号(alarm()触发) |
| SIGTERM | 15 | Term | 终止信号(默认kill命令发送) |
| SIGSTOP | 19 | Stop | 暂停进程(无法捕获 / 阻塞 / 忽略) |
kill向指定进程发送信号:
c
运行
#include <signal.h> #include <sys/types.h> // 向pid对应的进程发送sig信号 int kill(pid_t pid, int sig);pid:目标进程 PID;sig:要发送的信号编号(如SIGKILL对应 9);signal注册信号处理函数,自定义信号的行为:
c
运行
#include <signal.h> // 注册信号处理函数 void (*signal(int signum, void (*handler)(int)))(int);signum:要捕获的信号编号;handler:处理函数(可选值:SIG_DFL:默认处理;SIG_IGN:忽略信号;void my_handler(int sig));SIG_ERR。共享内存是 System V 提供的一种高效的进程间通信方式,通过让多个进程直接访问同一块物理内存实现数据共享(无需拷贝,速度快)。
共享内存的生命周期分为 5 步:
| 特性 | 共享内存 | 管道 |
|---|---|---|
| 读写权限 | 双方均可读写 | 半双工(一端读、一端写) |
| 同步机制 | 需配合信号 / 信号量等同步 | 自带同步(无数据时读阻塞) |
| 数据管理 | 不删除数据,数据保持 | 数据读取后被移除 |
| 效率 | 极高(直接访问内存) | 较低(需内核拷贝) |
shmgetc
运行
#include <sys/ipc.h> #include <sys/shm.h> // 创建或获取共享内存 int shmget(key_t key, size_t size, int shmflg);key:共享内存的键值(可通过ftok生成);size:共享内存大小(字节);shmflg:标志位(如IPC_CREAT|0666表示创建并设置权限);ftok为共享内存生成唯一键值:
c
运行
#include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id);pathname:已存在的文件路径;proj_id:整形数字(通常用 ASCII 字符);shmat将共享内存映射到进程地址空间:
c
运行
#include <sys/shm.h> void *shmat(int shmid, const void *shmaddr, int shmflg);shmid:共享内存 ID;shmaddr:映射地址(NULL 表示由系统分配);shmflg:标志位(如 0 表示可读可写);(void*)-1。shmdt将共享内存从进程地址空间撤销:
c
运行
#include <sys/shm.h> int shmdt(const void *shmaddr);shmaddr:shmat返回的映射地址;shmctl删除共享内存或获取 / 设置其属性:
c
运行
#include <sys/shm.h> int shmctl(int shmid, int cmd, struct shmid_ds *buf);shmid:共享内存 ID;cmd:操作命令(如IPC_RMID表示删除共享内存);buf:共享内存属性结构体(可传 NULL);ipcs -m;ipcrm -m 共享内存ID。