>> Edit article
이름
제목
패스워드
아래 소스를 입력하여 컴파일 하게 되면 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); }
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved