别摸我的键盘 的学生作业:
sem.h
#ifndef __SEM_UTIL__
#define __SEM_UTIL__
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PATH "."
#define PROID 88
union semun{
int val;
unsigned short* array;
};
/**
* 创建并初始化信号量集合
*/
extern int sem_create(int num, unsigned short sem_init_vals[]);
/**
* 信号量占用
*/
extern int sem_p(int sem_id, int semnum);
/**
* 信号量释放
*/
extern int sem_v(int sem_id, int semnum);
/**
* 信号量集合删除
*/
extern int sem_del(int sem_id);
/**
*获取当前时间字符串 format : yyyy-MM-dd hh:mm:ss
*/
extern char * gettime();
#endif
sem.c
#include "sem.h"
int sem_create(int num, unsigned short sem_init_vals[]){
key_t key = ftok(PATH, PROID);
if(key == -1){
perror("ftok()");
exit(EXIT_FAILURE);
}
int sem_id = semget(key, num, IPC_CREAT|0666);
if(key == -1){
perror("semget()");
exit(EXIT_FAILURE);
}
union semun se;
se.array = sem_init_vals;
int ret = semctl(sem_id, 0, SETALL, se);
if(key == -1){
perror("semctl()");
exit(EXIT_FAILURE);
}
return sem_id;
}
int sem_p(int sem_id, int semnum){
struct sembuf semb;
semb.sem_num = semnum;
semb.sem_op = -1;
semb.sem_flg = SEM_UNDO;
return semop(sem_id, &semb, 1);
}
int sem_v(int sem_id, int semnum){
struct sembuf semb;
semb.sem_num = semnum;
semb.sem_op = 1;
semb.sem_flg = SEM_UNDO;
return semop(sem_id, &semb, 1);
}
int sem_del(int sem_id){
return semctl(sem_id, 0, IPC_RMID, NULL);
}
char * gettime(){
time_t cur_time;
struct tm *local_tm;
static char buf[20];
cur_time = time(NULL);
if(cur_time == ((time_t) - 1)){
fprintf(stderr, "failed to obtain the current time.\n");
return NULL;
}
local_tm = localtime(&cur_time);
if(local_tm == NULL){
fprintf(stderr, "failed to convert the time.\n");
return NULL;
}
sprintf(buf,"%04d-%02d-%02d %02d:%02d:%02d",local_tm->tm_year + 1900, local_tm->tm_mon+1, local_tm->tm_mday,
local_tm->tm_hour, local_tm->tm_min, local_tm->tm_sec);
return buf;
}
Makefile
all:
@gcc sem.c main.c -o main
clean:
@rm -rf main
mian.c
#include "sem.h"
#define SEM_NUM 2
#define SEM_NUM_P 0
#define SEM_NUM_C 1
#define WRITE_FILE "./time"
#define MAX 64
int main(int argc, const char *argv[])
{
FILE *w_file;
char buf[MAX];
int idx = 0;
w_file = fopen(WRITE_FILE, "w+");
if(w_file == NULL){
perror("fopen()");
exit(EXIT_FAILURE);
}
unsigned short sem_init_vals[] = {1,0};
int sem_id = sem_create(SEM_NUM, sem_init_vals);
pid_t pid = fork();
if(pid == -1){
perror("fork()");
exit(EXIT_FAILURE);
}else if(pid == 0){
while(idx != 11){
sem_p(sem_id, SEM_NUM_C);
memset(buf, 0, MAX);
snprintf(buf, MAX, "%s", gettime());
//buf = t;
//strcpy(buf, t);
fwrite(buf,sizeof(char), strlen(buf), w_file);
fflush(w_file);
sem_v(sem_id, SEM_NUM_P);
idx ++;
}
fclose(w_file);
exit(EXIT_SUCCESS);
}else if(pid > 0){
while(idx != 11){
sem_p(sem_id, SEM_NUM_P);
memset(buf, 0, MAX);
snprintf(buf, MAX, "%d,\n");
fwrite(buf, sizeof(char), strlen(buf), w_file);
fflush(w_file);
sem_v(sem_id, SEM_NUM_P);
sleep(1);
idx ++;
}
fclose(w_file);
wait(NULL);
sem_del(sem_id);
exit(EXIT_SUCCESS);
}
return 0;
}