>> Read No. 30447 article  
프로그램 질문입니당...

등록 2001-05-15 22:05:00     조회 1
이름 초보자    

		아래 소스 코드를 입력하여 컴파일을 하면 아래와 같은 에러 메시지가 나타납니다.
왜 그런지 가르쳐 주세요!!!
  # 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
}
이름
암호


>> 관련글
30447 프로그램 질문입니당...  초보자  2001.05.15  ....
  답장 RE: 프로그램 질문입니당...  이명준.  2001.05.16  ....
Register [ localhost 목록보기 윗글 아랫글
글쓰기
답장쓰기 수정 삭제
정규표현식 [ 상세 검색 ]
페이지로딩: [ 0.67 초 ] 작업시간: [ 0.09 초 ]

Copyleft 1999-2026 by JSBoard Open Project
Theme Designed by IDOO All right reserved
[TOP]

적수네 동네
+
| 적수네 동네
| 공부방
| 리눅스 잡지 서고
| LSN 소스
| 링크 모음
+---+
게시판
+
| 떠들어보세!
| 질문과 답변
| 새소식과 정보
| 1원짜리 팁?
| 대화방
+---+
칼럼?
+
| 세하 훔쳐보기
| Welcome2nite
| 혜진의 염장판
+---+
리눅스 상표권
+
| 반대 서명란
| 토론 게시판
+---+
GNU
+
| GNU 선언문
| GNU GPL
| GNU 미러 목록
+---+
프로젝트?
+
| 리눅스카운터
| RC5DES
| 실질헌법 제작
+---+
커널 소식
+
| 안정 버젼: 2.4.14
+---+
테마 선택
+
LSN 방송국?
+
| OFF AIR
+---+
회원
+
| 로그인
+---+
[ 적수네 동네 ] [ 리눅스 상표권 독점 반대 ] [ 한글 리눅스 문서 프로젝트 ] [ KrLine ] [ 사랑넷 ] [ Valid HTML 4.0! ] [ SlashDot ] [ Freshmeat ]
Copyleft (C) 1998-2001 Byeong-Chan Kim . License
TIME: 1789543994
System by WYZsoft, HDD by I.O.Linux, Mizi Research, Embryo, WOWLINUX, Domain by SarangNet, Network by KrLine.