信號(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