使用P、V操作:使用信号量控制A、B两个程序同步交替运行,即B运行3秒、A运行3秒、B运行3秒…… ,循环10次后两个程序结束运行。
时间: 2023-11-27 15:55:42 浏览: 89
以下是使用信号量控制A、B两个程序同步交替运行的示例代码:
A程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sem.h>
#define SEM_KEY 1234
#define NUM_SEMS 2
void P(int sem_id, int sem_num) {
struct sembuf sem_op;
sem_op.sem_num = sem_num;
sem_op.sem_op = -1;
sem_op.sem_flg = 0;
semop(sem_id, &sem_op, 1);
}
void V(int sem_id, int sem_num) {
struct sembuf sem_op;
sem_op.sem_num = sem_num;
sem_op.sem_op = 1;
sem_op.sem_flg = 0;
semop(sem_id, &sem_op, 1);
}
int main() {
int sem_id, i;
union semun {
int val;
struct semid_ds *buf;
ushort *array;
} arg;
sem_id = semget(SEM_KEY, NUM_SEMS, IPC_CREAT | 0666);
if (sem_id == -1) {
perror("semget");
exit(1);
}
arg.val = 1;
semctl(sem_id, 0, SETVAL, arg);
semctl(sem_id, 1, SETVAL, arg);
for (i = 0; i < 10; i++) {
P(sem_id, 0);
printf("A running...\n");
sleep(3);
V(sem_id, 1);
}
semctl(sem_id, 0, IPC_RMID, arg);
return 0;
}
```
B程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sem.h>
#define SEM_KEY 1234
#define NUM_SEMS 2
void P(int sem_id, int sem_num) {
struct sembuf sem_op;
sem_op.sem_num = sem_num;
sem_op.sem_op = -1;
sem_op.sem_flg = 0;
semop(sem_id, &sem_op, 1);
}
void V(int sem_id, int sem_num) {
struct sembuf sem_op;
sem_op.sem_num = sem_num;
sem_op.sem_op = 1;
sem_op.sem_flg = 0;
semop(sem_id, &sem_op, 1);
}
int main() {
int sem_id, i;
union semun {
int val;
struct semid_ds *buf;
ushort *array;
} arg;
sem_id = semget(SEM_KEY, NUM_SEMS, IPC_CREAT | 0666);
if (sem_id == -1) {
perror("semget");
exit(1);
}
arg.val = 0;
semctl(sem_id, 0, SETVAL, arg);
semctl(sem_id, 1, SETVAL, arg);
for (i = 0; i < 10; i++) {
P(sem_id, 1);
printf("B running...\n");
sleep(3);
V(sem_id, 0);
}
semctl(sem_id, 0, IPC_RMID, arg);
return 0;
}
```
这个程序中使用了两个信号量,一个信号量用于控制A程序的执行,另一个信号量用于控制B程序的执行。初始时,A程序的信号量被初始化为1,B程序的信号量被初始化为0。A程序先运行,当A程序执行完3秒后,V操作将B程序的信号量加1,此时B程序才能运行。当B程序执行完3秒后,V操作将A程序的信号量加1,此时A程序才能继续运行。循环10次后,两个程序退出并释放信号量。
阅读全文