아래 소스를 입력하여 컴파일 하게 되면
union semun sem_union;
이 부분에서 에러가 나는데... 사이즈를 계산할 수 없다는 에러가 납니다...
왜 그런지 가르쳐 주세요... 어떻게 하면 해결할 수 있나요?
/* 세마포어 테스트 예제 - sem1.c */
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <errno.h>
#define SEMKEY 0x100
/*
* 세마포어를 생성하거나 식별자를 얻는다.
*
* 매개변수 : semkey - 생성하거나 식별자를 얻을 세마포어에 사용하는 키값
* 반환값 : 에러시 -1, 성공시 해당 세마포어의 식별자
*
*/
int initsem(int semkey) {
int semid, status = 0;
union semun sem_union;
if((semid = semget(semkey, 1, 0666 | IPC_CREAT | IPC_EXCL)) == -1) {
if(errno == EEXIST) {
semid = semget(semkey, 1, 0); /* 이미 존재할 경우에 식별자만 얻는다. */
}
} else {
sem_union.val = 1; /* 세마포어를 생성한 프로세스만 그 값을 초기화 */
status = semctl(semid, 0, SETVAL, sem_union);
}
if (semid == -1 || status == -1) {
perror("initsem");
return -1;
}
/* 식별자가 0이 될 수 있으므로 에러시 0을 반환하지 않도록 주의 */
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)");
return -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)");
return -1;
}
return 0;
}
void handlesem(int semkey) {
int semid, pid = getpid();
if((semid = initsem(semkey)) < 0) exit(1);
printf("process %d before critical section", pid);
p(semid);
printf("process %d in critical section", pid);
sleep(2);
printf("process %d leaving critical section", pid);
v(semid);
printf("process %d exiting", pid);
exit(0);
}
void main() {
if(fork() == 0) handlesem(SEMKEY);
if(fork() == 0) handlesem(SEMKEY);
if(fork() == 0) handlesem(SEMKEY);
}