공유메모리 초기화에 관한 질문입니다.
글쓴이: kknd345 / 작성시간: 토, 2005/10/01 - 11:19오전
같은 프로그램인데 여러번 프로그램을 실행시켜
프로세스를 여러개 만들어서 그 프로세스끼리 데이터를 주고 받기 위해
공유 메모리를 설정했습니다.
그런데 문제가 공유 메모리를 int cnt_number==0 일때 memset으로 초기화 할려고 했는데... 쓰레기 값으로 인해서 초기화가 안 되길래 ...
cnt_number < 1 || cnt_number > MAX_NUMBER 일때 초기화 할려고 했는데... 쓰레기 값이 딱 가운데에 있네요ㅜㅜ..
어떤식으로 초기화 하면 좋을까요?
shmid=shmget((key_t)200424398,sizeof(struct shared_use_st),0666 | IPC_CREAT); if(shmid == -1){ fprintf(stderr,"shmget failed\n"); exit(EXIT_FAILURE); } shared_memory=shmat(shmid,(void*)0,0); if(shared_memory == (void *)-1){ fprintf(stderr,"shmat failed\n"); exit(EXIT_FAILURE); } shared_stuff=(struct shared_use_st *)shared_memory; tmp_cnt_user = shared_stuff->cnt_user; if ( tmp_cnt_user < 1 || tmp_cnt_user > 10 ){ memset( shared_stuff, 0, sizeof(struct shared_use_st)); } // Shared_Memory 초기화
이전 접속 프로세스가 있을수도 있기 때문에 무조건 바로 초기화 할수는 없거든요 ...
Forums:
최초의 fork and exec 단계이전에 공유메모리를 할당받고서 [
최초의 fork and exec 단계이전에 공유메모리를 할당받고서
memset( shared_memory, 0x00, sizeof(struct shared_use_st) );
하시는게 순서가 아닐까요? 그리고 위의 (key_t)200424398는 프로세스간 공유를 하신다면 특정 파일을 이용하실것 같은데 ftok를 사용하셔서 key_t type을 유도하시는 것이 맞을것 같은데요..
이전 접속 프로세스가 있을수도 있기 때문에 무조건 바로 초기화 할수는 없거든요 ...
최초 실행시 공유메모리가 아직 생성되지 않았다는 확실한 사실이 있다면 이건 걱정하지 않아도 될 것 같습니다.
-----[꼬릿말 절취선 시작]-----
삽질전에 먼저 구글신께 기도하자.
-----[꼬릿말 절취선 끝]-----
공유메모리를 연결할 때, 이미 존재하는 것에 대한 ID를 얻었는지, 아니
공유메모리를 연결할 때, 이미 존재하는 것에 대한 ID를 얻었는지, 아니면 새로 생성한 것인지 알 수 있습니다.
새로 생성한 것이면 초기화를 하고 아니면 말고 하면 됩니다.
그래서
IPC_EXCL used with IPC_CREAT to ensure failure if the segment already exists.
이런 플래그가 존재하는 것이지요. ^^
댓글 달기