read/write 구현하는 과제인데
실행하면 자꾸 세그멘테이션오류가 뜨는데 뭐가잘못된건지좀 봐주세요 ㅜㅜ
컴파일은 잘되는데
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <errno.h>
#include <time.h>
#define SEMPERM 0600
#define TRUE 1
#define FALSE 0
typedef union _semun {
int val;
struct semid_ds *buf;
ushort *array;
} semun;
int initsem(key_t semkey, int n)
{
int status = 0, semid;
if ((semid = semget(semkey, 1, SEMPERM | IPC_CREAT | IPC_EXCL)) == -1)
{
if (errno == EEXIST)
semid = semget(semkey, 1, 0);
}
else
{
semun arg;
arg.val = n;
status = semctl(semid, 0, SETVAL, arg);
}
if (semid == -1 || status == -1)
{
perror("initsem failed");
return (-1);
}
return (semid);
}
int p(int semid)
{
struct sembuf p_buf;
p_buf.sem_num = 0;
p_buf.sem_op = -1;
p_buf.sem_flg = SEM_UNDO;
if (semop(semid, &p_buf, 1) == -1)
{
perror("p(semid) failed");
exit(1);
}
return (0);
}
int v(int semid)
{
struct sembuf v_buf;
v_buf.sem_num = 0;
v_buf.sem_op = 1;
v_buf.sem_flg = SEM_UNDO;
if (semop(semid, &v_buf, 1) == -1)
{
perror("v(semid) failed");
exit(1);
}
return (0);
}
void readLength(int *length) {
FILE* lenr = fopen("okToRead_Length", "r");
while (feof(lenr) == 0) {
fscanf(lenr, "%d", length);
}
fclose(lenr);
}
void writeLength(int *length) {
FILE* lenw = fopen("okToRead_Length", "a");
fprintf(lenw, "%d\n", *length);
fclose(lenw);
}
int wait(int cond, int lock) {
int length = 0;
readLength(&length);
length++;
writeLength(&length);
v(lock);
p(cond);
p(lock);
return(0);
}
int signal(int cond, int lock) {
int length = 0;
readLength(&length);
if (length>0) {
v(cond);
length--;
writeLength(&length);
}
return(0);
}
int broadCast(int cond, int lock) {
int length = 0;
readLength(&length);
while (length>0) {
v(cond);
length--;
writeLength(&length);
readLength(&length);
}
return(0);
}
void readFile(int *AW, int *AR, int *WW, int *WR) {
FILE* AWr = fopen("AW", "r");
while (feof(AWr) == 0) {
fscanf(AWr, "%d", AW);
}
fclose(AWr);
FILE* ARr = fopen("AR", "r");
while (feof(ARr) == 0) {
fscanf(ARr, "%d", AR);
}
fclose(ARr);
FILE* WWr = fopen("WW", "r");
while (feof(WWr) == 0) {
fscanf(WWr, "%d", WW);
}
fclose(WWr);
FILE* WRr = fopen("WR", "r");
while (feof(WRr) == 0) {
fscanf(WRr, "%d", WR);
}
fclose(WRr);
}
void writeFile(int *AW, int *AR, int *WW, int *WR) {
time_t current_time;
struct tm *struct_time;
time(¤t_time);
struct_time = localtime(¤t_time);
FILE* AWw = fopen("AW", "a");
fprintf(AWw, "%d %d%d ", getpid(), struct_time->tm_min, struct_time->tm_sec);
fprintf(AWw, "%d\n", *AW);
fclose(AWw);
FILE* WWw = fopen("WW", "a");
fprintf(WWw, "%d %d%d ", getpid(), struct_time->tm_min, struct_time->tm_sec);
fprintf(WWw, "%d\n", *WW);
fclose(WWw);
FILE* ARw = fopen("AR", "a");
fprintf(ARw, "%d %d%d ", getpid(), struct_time->tm_min, struct_time->tm_sec);
fprintf(ARw, "%d\n", *AR);
fclose(ARw);
FILE* WRw = fopen("WR", "a");
fprintf(WRw, "%d %d%d ", getpid(), struct_time->tm_min, struct_time->tm_sec);
fprintf(WRw, "%d\n", *WR);
fclose(WRw);
}
void main(int argc, char *argv[])
{
sleep(atoi(argv[1]));
key_t semkey = 0x200;
key_t key_m = 1993061200;
key_t key_okR = 1993061201;
key_t key_okW = 1993061202;
int semid, lock, okToRead, okToWrite;
pid_t pid;
pid = getpid();
if ((lock = initsem(key_m, 1)) < 0)
exit(1);
if ((okToRead = initsem(key_okR, 0)) < 0)
exit(1);
if ((okToWrite = initsem(key_okW, 0)) < 0)
exit(1);
printf("process %d in critical section\n", pid);
p(lock);
int AW = 0, AR = 0, WW = 0, WR = 0;
readFile(&AW, &AR, &WW, &WR);
while ((AW + WW) > 0)
{
WR++;
writeFile(&AW, &AR, &WW, &WR);
wait(okToRead, lock);
readFile(&AW, &AR, &WW, &WR);
WR--;
writeFile(&AW, &AR, &WW, &WR);
}
AR++;
writeFile(&AW, &AR, &WW, &WR);
v(lock);
sleep(atoi(argv[2]));
p(lock);
readFile(&AW, &AR, &WW, &WR);
AR--;
writeFile(&AW, &AR, &WW, &WR);
readFile(&AW, &AR, &WW, &WR);
if (AR == 0 && WW > 0)
signal(okToWrite, lock);
v(lock);
exit(0);
}
댓글 0