信号(signal)
#include <signal.h>
#include <stdio.h>
#include <unistd.h>void handler(int sig) {printf("收到信号: %d\n", sig);
}int main() {signal(SIGUSR1, handler); // 注册用户自定义信号printf("进程 PID=%d,等待信号...\n", getpid());while (1) pause(); // 阻塞等待信号return 0;
}
使用 kill(pid, SIGUSR1) 发送信号给目标进程
信号处理函数 handler 在信号到来时被调用
共享内存(shm)
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>int main() {key_t key = ftok(".", 'A'); int shmid = shmget(key, 4096, IPC_CREAT | 0664);char *shmaddr = (char *)shmat(shmid, NULL, 0);// 写入数据strcpy(shmaddr, "Hello from shm!");printf("写入共享内存: %s\n", shmaddr);// 读数据printf("读出共享内存: %s\n", shmaddr);shmdt(shmaddr); // 解除映射// shmctl(shmid, IPC_RMID, NULL); // 删除共享内存(必要时执行)return 0;
}
共享内存效率最高,多个进程可挂接同一 shmid
shmat 建立映射后可直接读写
信号量(semaphore)
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>// 定义 P/V 操作
void sem_p(int semid) {struct sembuf s = {0, -1, 0}; // -1:申请semop(semid, &s, 1);
}void sem_v(int semid) {struct sembuf s = {0, +1, 0}; // +1:释放semop(semid, &s, 1);
}int main() {key_t key = ftok(".", 'B');int semid = semget(key, 1, IPC_CREAT | 0664);semctl(semid, 0, SETVAL, 1); // 初始化为 1(互斥锁)sem_p(semid);printf("进入临界区...\n");sleep(2);printf("退出临界区...\n");sem_v(semid);return 0;
}
信号量本质是计数器,用于进程同步或互斥
P 操作(申请资源)使信号量减 1
V 操作(释放资源)使信号量加 1