Linux信号灯示例
时间: 2023-07-07 19:05:52 浏览: 52
Linux信号灯(Semaphore)是一种进程间同步的机制,用于控制访问共享资源的并发数。
下面是一个简单的Linux信号灯示例,其中包含一个生产者进程和一个消费者进程:
```c
// 生产者进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#define SEM_KEY 1234 // 信号灯key
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
int main() {
int semid;
union semun arg;
struct sembuf wait = { 0, -1, SEM_UNDO }; // 等待信号灯操作
struct sembuf signal = { 0, 1, SEM_UNDO }; // 发送信号灯操作
// 创建信号灯
semid = semget(SEM_KEY, 1, IPC_CREAT | 0666);
if (semid == -1) {
perror("Error creating semaphore");
exit(EXIT_FAILURE);
}
// 初始化信号灯
arg.val = 1;
if (semctl(semid, 0, SETVAL, arg) == -1) {
perror("Error initializing semaphore");
exit(EXIT_FAILURE);
}
// 生产者进程
while (1) {
// 等待可用资源
if (semop(semid, &wait, 1) == -1) {
perror("Error waiting semaphore");
exit(EXIT_FAILURE);
}
// 生产资源
printf("Producing resource...\n");
sleep(1);
// 发送信号通知消费者进程可用
if (semop(semid, &signal, 1) == -1) {
perror("Error signaling semaphore");
exit(EXIT_FAILURE);
}
}
return 0;
}
```
```c
// 消费者进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#define SEM_KEY 1234 // 信号灯key
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
int main() {
int semid;
union semun arg;
struct sembuf wait = { 0, -1, SEM_UNDO }; // 等待信号灯操作
struct sembuf signal = { 0, 1, SEM_UNDO }; // 发送信号灯操作
// 获取信号灯
semid = semget(SEM_KEY, 1, IPC_CREAT | 0666);
if (semid == -1) {
perror("Error getting semaphore");
exit(EXIT_FAILURE);
}
// 消费者进程
while (1) {
// 等待可用资源
if (semop(semid, &wait, 1) == -1) {
perror("Error waiting semaphore");
exit(EXIT_FAILURE);
}
// 消费资源
printf("Consuming resource...\n");
sleep(1);
// 发送信号通知生产者进程可用
if (semop(semid, &signal, 1) == -1) {
perror("Error signaling semaphore");
exit(EXIT_FAILURE);
}
}
return 0;
}
```
在这个示例中,生产者进程和消费者进程共享一个信号灯。生产者进程生产资源并等待信号灯,消费者进程消耗资源并等待信号灯。每当资源可用时,信号灯被发送,通知等待进程可以继续操作。