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(&current_time);

struct_time = localtime(&current_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);

}