简介
- 创建多个进程,每个进程对文件中的数字进行加一操作
- 其中用信号量实现一个加锁、解锁的功能
代码
sem.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/sem.h>
#include <errno.h>
#define FILE_NAME "./temp"
#define PROCNUM 1024
static int semid;
static void P(void){
struct sembuf op;
op.sem_num = 0;
op.sem_op = -1;
op.sem_flg = 0;
while(semop(semid, &op, 1) < 0){
if(errno != EINTR || errno != EAGAIN){
perror("semop()");
exit(1);
}
}
return ;
}
static void V(void){
struct sembuf op;
op.sem_num = 0;
op.sem_op = 1;
op.sem_flg = 0;
if(semop(semid, &op, 1) < 0){
perror("semop()");
exit(1);
}
return ;
}
int make_add(void){
FILE *fp = fopen(FILE_NAME, "rw+");
if(fp == NULL){
perror("fopen()");
exit(1);
}
char num[8] = "";
P();
fgets(num, 8, fp);
fseek(fp, 0, SEEK_SET);
fprintf(fp, "%d", atoi(num) + 1);
fflush(fp);
V();
pclose(fp);
return 0;
}
int main(){
pid_t pid;
int i;
semid = semget(IPC_PRIVATE, 1, 0644);
if(semid < 0){
perror("semget()");
exit(1);
}
if(semctl(semid, 0, SETVAL, 1) < 0){
perror("semctl()");
exit(1);
}
for(i = 0; i < PROCNUM; i++){
pid = fork();
if(pid < 0){
perror("fork()");
exit(1);
}
if(pid == 0){
make_add();
exit(1);
}
}
for(i = 0; i < PROCNUM; i++){
wait(NULL);
}
if(semctl(semid, 0, IPC_RMID) < 0){
perror("semctl()");
exit(1);
}
exit(0);
}
测试结果
-
运行前
-
运行后
总结
- 使用信号量,就可以很好的对多个临界资源进行管理。