shared memory에 attach할 때, 성공할때도 있고 실패할때도 있습니다..
글쓴이: 심용희 / 작성시간: 금, 2006/05/26 - 1:13오전
안녕하세요. 거의 1년을 아프다가 이제서야 다시 생활전선에 복귀했습니다. ^^;;
아, 질문은 다음과 같습니다.
작업환경:
SunOS ac1a 5.9 Generic_112233-12 sun4u sparc SUNW,Sun-Fire-880
컴파일러:
gcc 3.3.2
make 3.80
사전작업:
shared memory를 만들거나 attach하는 것은 library로 제공.
shared memory에 access할 수 있는 키는 공용 include에서 제공.
1. A process 또는 B process에서 먼저 동작하는 프로세스에서 shared memory에 큐를 만들고,
2. 나중에 동작하는 프로세스에서 먼저 만들어진 shared memory에 attach 시도 합니다.
3. 잘 될때가 있고 또는 Invalid parameter 또는 permission deny 에러를 냅니다.
우선, shared memory에 attach 또는 create할 때, 사용되는 argument의 size는 똑같습니다.
그리고, A process도, B process도 root 권한으로 수행되며,
shared memory를 만들때 사용되는 퍼미션은 0666이고, attach시에 사용되는 퍼미션 역시 같습니다.
이런 현상이 왜 일어나는지 짐작을 할 수 없네요... 혹시 같은 경험을 하신분 계신가요?
Forums:
공유메모리 만들 때 크기도 매번 같은가요?
공유메모리를 attach 하고 만드는 라이브러리를 제공한다고 하셨는데, 그 라이브러리를 사용하는 프로그램에서 메모리를 만드는 사이즈가 매번 같은가요?
/etc/system 파일에 설정되어 있는 값을 확인해 보세요. 사용법이 정확한데 에러가 발생할 경우에는 시스템 설정값의 제한에 걸리는 경우가 많습니다.
--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)
--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)
네 매번 같습니다.
제가 작성한 라이브러리에서 임의의 크기로 설정한 값을 사용하게 되어있습니다.
그런데, 이 버그에 대해 이 질문을 올리기 전부터 지금까지 계속 디버깅을 해 본 결과,
분명히, 라이브러리에서 제공한 attach함수로 만들면 같은 크기의 shared memory 가 생성되어야 함에도 불구하고,
어떤 프로그램에서 attach함수를 호출했을 때는, ipcs -am으로 확인해 본 결과, 다른 크기의 SEGSZ가 지정된 것을 확인했습니다.
attach(..., size_t size)로, attach함수를 변경해서 size를 넘겨서도 attach를 시도하였지만, 역시 shared memory 사이즈는 실제 생성되어야 하는 값과
틀리게 지정되었습니다.
function에서 인자를 넘겨서까지 shared memory에 access하는 루틴을 수정했음에도 불구하고 그 크기대로 만들어지지 않았다 함은..
제가 제공한 library를 제대로 링크하지 못하였거나, 다른 library에서 제가 제공한 함수와 같은 명칭의 이름이 있다고 예상할 수 있을듯 한데요..
아. 그리고, 혹시 alian 문제에 걸릴듯 하여, shared memory에 생길 구조체는 align을 8byte에 모두 맞춰두었습니다.
갑갑합니다 ㅡㅡ;; 원인을 알았지만 해결될 기미가 안보이다니..
지금까지의 디버깅 결과)
A process(제공된 library 사용하여 shared memory에 attach 또는 없다면 create)
B process(제공된 library 사용하여 shared memory에 attach 또는 없다면 create)
C process(제공된 library 사용하여 shared memory에 attach 또는 없다면 create)
B process와 C process는 생성한 shared memory를 통해 정상적으로 데이터 교환.
A process와 B process간에는 shared memory가 정상적인 크기로 생성되지 않았음.(당연히 데이터 교환도 안됨).
shared memory에 공유queue를 만드는 함수는 모두 동일한 library로 제공함.
ldd 으로 A,B,C 세 프로세스의 library link된 내용을 확인하여 모두 필요한 라이브러리를 제대로 링크하고 있음을 확인.
A process --> shared memory --> B process 진행절차에서
A process에서 shared memory에 access못하고 core를 떨어뜨리길래, gdb로 본 결과 gdb core(gdb segmentation fault)가 생성됨.
A process내에서 제공한 library를 사용하지 않고, 직접 코딩으로 shared memory에 attach또는 create하여 통신을 시도하여 보았으나 실패.
A process 내의 Makefile에서 library링크 순서를 바꿔보았으나 실패.
Sample program을 작성하여, B process와 통신하였을때는 정상.
다른 프로세스와 B process간에 library를 사용하여 shared memory를 통한 데이터 교환은 성공.
A process와 B process간, A process와 다른 sample program간에 데이터 교환 실패.
하아.. 오늘도 이놈때문에 새벽에나 집에 얼굴을 비치겠군요..
댓글 달기