• ベストアンサー

Linux で Posix の共有メモリ

selenityの回答

  • ベストアンサー
  • selenity
  • ベストアンサー率41% (324/772)
回答No.1

あなたの環境がわからないので何とも言えませんし、どんなエラーが出ているのかもわからないので何も答えられませんが、google等で「shm_open LINUX LINK」をキーワードにして探してみましょう。 ライブラリ的にはglibcの中のような気がします。 まずは、書籍と同一環境を作り、その上で試すのが基本でしょう。

17ga0
質問者

お礼

遅くなりましたが、どうもありがとうございました。

関連するQ&A

  • shm_open() で作った共有メモリ一覧

    shm_open() を使って作ったPOSIX共有メモリオブジェクトの名前の一覧を取得する方法を教えてください。 /dev/shm/ ディレクトリ以下にあることは分かっているのですが、それは今の Linux 固有の実装ですよね? OSや環境が変わったら /dev/shm/ 以下を readdir() する手法は使えない可能性があると思うんですが、かといって他に一覧を取得する方法がわかりません。

  • Solaris10でのPOSIX関数の使用方法は?

    お世話になります。 Solaris10(SPARC)にてSunStudio11を導入しています。 この環境下において、POSIX共有メモリ関数(shm_open)を使用したプログラムのコンパイルをしたいのですが、コンパイル時に暗黙の型宣言の警告メッセージとなってしまいます。プリプロセッサによるヘッダファイルの処理結果を見ると、shm_openの型宣言が読み込まれていないようです。(manページで指定されていたヘッダファイルは、インクルード済み) どのような点に問題があるのでしょうか?お気づきの方、ご意見ください。

  • gccでの共有ライブラリのver指定

    表題の件に関して質問させていただきます。 たとえば/usr/libにある;libA.soをリンクしたい時、gccでは gcc -lA としますが、libA.so.1,libA.so.2‥と複数バージョンがある場合、バージョンまで指定してコンパイルすることは可能でしょうか? サーバー権限を持っていないので、シンボリックリンクを張り直すという手は使えません。 また、自分のアカウントで同共有ライブラリを用意したのですが、/usr/libが優先されてしまい、自分のアカウントのライブラリを設定することは出来ません。 解決法をご存知の方、ご教授お願い致します。

  • 共有ライブラリが見つからない

     お世話になります。  xxxxxというソフトウェアを動作させようとしたところ、下記のようなエラーメッセージが出ました。 > ld.so.1: xxxxx: fatal: libsasl.so: version `SUNWprivate1.1' not found (required by file /usr/lib/mps/libldap60.so) > ld.so.1: xxxxx: fatal: libsasl.so: open failed: No such file or directory > rc = 9 ■質問1  これは、 ・ld.so.1という共有モジュールが ・内部的にrequired by file /usr/lib/mps/libldap60.so というモジュールを呼んでいて ・それがlibsasl.soを呼ぼうとしたときに ・`SUNWprivate1.1'というバージョンのものがない というエラーだと解釈してよろしいでしょうか。 ■質問2  findでlibsasl.soを検索したところ、下記の場所にありました。 > /usr/lib/sparcv9/libsasl.so > /usr/lib/libsasl.so crleコマンドで共有ライブラリの検索パスを見てみたところ、/usr/libは含まれていました。 > @root# crle -v > > 構成ファイル [バージョン 4]: /var/ld/ld.config > デフォルトライブラリパス (ELF): /usr/lib:/usr/local/ssl/lib/:/usr/lib/mps > トラステッドディレクトリ (ELF): /usr/lib/secure:/opt/SUNWmsgsr/lib:/usr/lib/mps > > コマンド行: > crle -c /var/ld/ld.config \ > -l /usr/lib:/usr/local/ssl/lib/:/usr/lib/mps \ > -s /usr/lib/secure:/opt/SUNWmsgsr/lib:/usr/lib/mps  それでもエラーが出るのは ・このディレクトリにあるlibsasl.soが`SUNWprivate1.1'というバージョンではないから という解釈でよろしいでしょうか。 ■質問3 `SUNWprivate1.1'というバージョンのlibsasl.soを検索する方法があるでしょうか。  いろいろですみません。よろしくお願いいたします。

  • 64bit Linux上で32bitアプリケーションを使って共有メモリアクセス

    64bit Linux と共有メモリとの関係についてどなたか教えて いただけないでしょうか。  (現段階では、マシンもOSも64bitのものは無く、導入前での   検討段階です) 使いたいと思っているのは Red Hat Enterprise Linux 3.0 です。 現在動かしているアプリケーションが使っている共有メモリの サイズが大きくなってきたために64bitのLinuxを検討しています。 ただし、プログラム移行の手間を最小限にするめ、64bit環境上で 32bitライブラリにリンクしてmakeし直す程度の対応で済ませたいと 思っています(言語はCです)。 このような32bitアプリケーションが発行する共有メモリ関係の API‥たとえば、shmget()とかshmat()‥の呼び出しは、どこかの レイヤで最終的に64bit化されて動くと想像しています。 そうすると、32bit用のインターフェースに破綻を来たさない限りは、 総量で4GB超の共有メモリをアクセス可能(具体的には、総量として 4GBを越えて取得でき、参照時にはマッピングサイズが小さければ、 それらのいずれの部分もマッピングできる)と想像しているのですが そのような理解で良いでしょうか。 ちなみに、4GB超の大きなメモリを1つ使うわけではなく、100個前後 に分散した取得/マッピングをしています。つまり個々のブロックは 小さなサイズです。 よろしくお願いします。

  • OpenSSLの共有ライブラリ(libcrypto.so)動的リンクにつきまして

    [環境] Linux version 2.6.9-67.EL gcc version 3.4.6 (Red Hat 3.4.6-8)) 以下のように、OpenSSLの共有ライブラリlibcrypto.soをロードする プログラムを書いているのですが、 ------ #include <stdio.h> #include <dlfcn.h> #include <errno.h> void main(void) { void* hSO; hSO = DLL_OPEN("/usr/local/ssl/lib/libcrypto.so", RTLD_NOW); if( hSO == NULL ) { printf("%s\n", dlerror()); } else { // 処理 } } ------ hSO = DLL_OPEN("/usr/local/ssl/lib/libcrypto.so", RTLD_NOW); で、NULLが返って来てしまいます。 [dlerror内容] /usr/local/ssl/lib/libcrypto.so: cannot open shared object file: No such file or directory しかし、このパスには、シンボリックリンクされたlibcrypto.soファイルが存在します。 試しに、同ディレクトリにあるlibcrypto.so.0.9.8mも試しましたが、同じエラーが出力されました。 パスの指定方法に、何か行う必要があるのでしょうか。

  • windowsでLinuxで作成したソースをコンパイル

    Linuxで作成、 $gcc -Wall file.c で、通ったファイルをWindowsでも同様に通したいので、MinGWを使って、コンパイルしたのですが、 #include <sys/socket.h> の構文で引っかかってしまいました。どうやらインクルードファイルが無いようでしたので、 C:\MinGW\include C:\MinGW\lib 以下に、Linuxの /usr/include/ /usr/lib/ 以下のファイルをそのまま入れて、再度実行しました。 ヘッダーファイルは見つけて読んでくれたのですが、そのヘッダーファイルに書いてある関数(例:htons(), socket(), inet_addr(), connect())が参照できないとの事で、怒られてしまいます。 Linuxのライブラリファイルをそのまま入れたのがまずかったのかもしれないのですが、こいつのエラーを解消する有効手段が見つかりません。 問題解決のヒント、又は答えを教えていただけませんでしょうか。 どうか、お願い致します。

  • 共有ライブラリへのパス指定の方法

    共有ライブラリへのパス指定の方法について教えて下さい。 環境は TurboLinux / C言語です lib_k.sl という共有ライブラリがあります。 【開発環境】  /hhn --- lib -(ここにlib_k.slがある)     |     -- src - ・・・(ここにプログラムのソースファイルがある) 【実行環境】  /ppc --- lib -(ここにlib_k.slを置く)     |     -- ld -(ここにプログラムのロードモジュールを置く) 開発プログラムのメイクファイルに、  /hhn/lib/lib_k.sl と書いてリンクさせています。すると、実行環境でも  /hhn/lib/lib_k.sl にリンクしようとしに行っているようです。 実行環境で /ppc/lib/lib_k.sl にリンクするには、どのようにすればよいのでしょうか? Cプログラミングはずっとやっていますが、共有ライブラリは使用したことが有りません。 ご教授お願いします。

  • Bourne Shell と POSIX について

    現在、会社でLinux 上でバッチプログラムを何本か作成しています。 その中で、規約に「シェルはB シェルとし、冒頭には /bin/sh と すること」というようなことが書かれていました。 これは互換性を意識してのことだと解釈し、拡張表現を使用しないことを 意識して書いていました。 具体的には、export VAR=VALUE みたいな書き方はせずに、 VAR=VALUE; export VAR みたいにするとか。 ところが、Solaris を触る機会があって、そのプログラムを 動かしてみると正しく動きませんでした。 その原因は、関数内でローカル変数を宣言するために local を 使っていたのですが、それが Solaris の /usr/bin/sh が 解釈してくれないためでした。 そこで、以下の疑問点が上がってきましたので、 可能な箇所だけでも回答をお願いできたらと思っています。 1. Solaris の /usr/bin/sh は POSIX に準拠しているのでしょうか? 2. 互換性を意識するのであれば local は使用しない方がよいという 結論だと思っています。それでは、local を使用せずにローカル変数を 使用したい場合や再帰処理を行いたい場合はどのような方法を使うのが 一般的なのでしょうか? それとも、拡張機能無しにそのようなことは できないと考えるべきなのでしょうか? 3. そもそも、POSIX でシェルに求められる必要条件とはどのようなこと があるのでしょうか?(どのようなことが規定されているか。 Google検索で見つけられなかったので、原文がWeb 公開されているので あればURL 指定でも・・・)

  • C++ リンクについて

    現在LINUX(Vine Linux)でC++の勉強をしています。 やさしいC++という本を読みながら勉強しているのですが、この本でいう「ファイルの分割」という部分でつまっています。 複数のファイルをコンパイルの時にどのようにリンクすればいいのか分かりません。 教本では myfunc.h 関数プロトタイプ宣言 myfunc.cpp 作成した関数の定義 Sample5.cpp main関数の定義(プログラム本体) とあり、それぞれを教本どおりに作成し、 g++ -o Sample5 Sample.cpp でコンパイルしようとすると、 /tmp/ccUgMR4c.o(.text+0x42): In function `main': : undefined reference to `max(int, int)' というエラーが出ます。(maxは作成した関数です。) maxが認識されてないみたいなので、この3つのファイルをつなぎ合わせる操作が必要だと思うのですが、どうすればよいのでしょう? 必要かわかりませんが、gcc -vと入力すると /usr/lib/gcc-lib/i386-vine-linux/3.3.6/specs から spec を読み込み中 コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-vine-linux スレッドモデル: posix gcc バージョン 3.3.6 release (Vine Linux 3.3.6-0vl7) となります。(リンクの方法を調べている時によく出てきていたので記載しました。) 自分なりに様々なサイトを調べたのですが、見つからなかったので質問させていただきます。 本来はもっと理解した上でプログラミングを勉強すべきなのでしょうが、明日までにこの本を読み終えないといけません。 よろしくお願いします。