>> Edit article
이름
제목
패스워드
아래 소스 코드를 입력하여 컴파일을 하면 아래와 같은 에러 메시지가 나타납니다. 왜 그런지 가르쳐 주세요!!! # gcc -o record record.c ipc_sem.c -DDEBUG record.c:10:21: ipc_sem.h: ?? ???? ????? ?? ipc_sem.c: In function `initsem': ipc_sem.c:20: storage size of `sem_union' isn't known ipc_sem.c: In function `delsem': ipc_sem.c:38: storage size of `sem_union' isn't known ----------------------------------------------------------------------------- /* ipc_sem.c : 재사용가능한 세마포어 루틴 */ #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <errno.h> int initsem(int semkey); int delsem(int semid); int p(int semid); int v(int semid); 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; } return semid; } int delsem(int semid) { union semun sem_union; if (semctl(semid, 0, IPC_RMID, sem_union) == -1) { perror("semaphore delete"); return -1; } return 0; } 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; } ------------------------------------------------------------------------------- /* record.c : 현재 프로세스의 실행시간 측정 */ #include <stdio.h> #include <unistd.h> #include <time.h> #include "ipc_sem.h" #define SEMKEY 0x100 #define RECORD_FILE "record.file" struct reg_list { pid_t pid;/* 프로세스 번호 */ time_t start; /* 프로세스 실행 시작 시간 */ time_t end; /* 프로세스 실행 종료 시간 */ }; struct reg_list reg; void reg_start(); void reg_end(int); void reg_start() { reg.pid = getpid(); /* 프로세스 번호 */ reg.start = time(NULL); /* 현재 시간 */ reg.end = (time_t)0; } void reg_end(int sem_delete_flag) { int semid; FILE *fp; if ((semid = initsem(SEMKEY)) < 0) exit(1); reg.end = time(NULL); p(semid); /* 임계영역의입구*/ if ((fp = fopen(RECORD_FILE, "a+")) == NULL) { perror(RECORD_FILE); return; /* 쓰기 실패 , SEM_UNDO 로 인해 세마포어값은 원래대로 돌아감 */ } fwrite(®, sizeof(struct reg_list), 1, fp); fclose(fp); v(semid); if (sem_delete_flag) { /* 세마포어 삭제 플래그가 설정되었다면 제거 */ delsem(semid); } } void main(int argc, char *argv[]) { reg_start(); sleep(2); /* 실제에 있어서의 어떤 작업 */ if (argc > 1) {/* 세마포어를 조건적으로 제거 */ reg_end(1); } else { reg_end(0); } #ifdef DEBUG /* 디버깅 코드 */ { char tbuf1[20], tbuf2[20]; FILE *fp; if ((fp = fopen(RECORD_FILE, "r")) == NULL) { perror(RECORD_FILE); exit(1); } while (fread(®, sizeof(struct reg_list), 1, fp) == 1) { strftime(tbuf1, 20, "%m/%d %I:%M:%S", localtime(&(reg.start))); strftime(tbuf2, 20, "%m/%d %I:%M:%S", localtime(&(reg.end))); printf("프로세스 : %5d , 시작시간: %s , 종료시간 : %s", reg.pid, tbuf1, tbuf2); } printf(""); } #endif }
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved