shared memory에 attach할 때, 성공할때도 있고 실패할때도 있습니다..

심용희의 이미지

안녕하세요. 거의 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시에 사용되는 퍼미션 역시 같습니다.

이런 현상이 왜 일어나는지 짐작을 할 수 없네요... 혹시 같은 경험을 하신분 계신가요?

jongi의 이미지

공유메모리를 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간에 데이터 교환 실패.

하아.. 오늘도 이놈때문에 새벽에나 집에 얼굴을 비치겠군요..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.