![]() |
Helloやアメリカ合衆国へようこそ! UNIXおよびLinuxフォーラム!訪問し、当社のグローバルコミュニティに参加いただきありがとうございます。
|
|
Googleのunix.com
|
|||||||
| 高レベルのプログラミング は、 C 、 C + +についての質問の投稿は、 Java 、 SQL 、および他のプログラミング言語です。 |
その他のUNIXおよびLinuxフォーラムトピックは参考にすること
|
||||
| スレッド | スレッドスターター | フォーラム | 返信 | 最後の投稿 |
| 【 C 】共有メモリでの問題 | hurricane86 | 高レベルのプログラミング | 2 | 2008年11月26日 05:58午後 |
| 共有ライブラリのための共有メモリ | otheus | 高レベルのプログラミング | 0 | 2008年9月3日 04:55午前 |
| 共有ライブラリ内の共有メモリ | DreamWarrior | 高レベルのプログラミング | 12 | 2007年5月30日 05:33午後 |
| メモリを共有する-メモリを共有していない- | elzalem | 高レベルのプログラミング | 9 | 2007年5月2日 08:45午前 |
| 未使用メモリを共有メモリ不足がたくさん | cjcamaro | UNIXの詳細&エキスパートのためのユーザー | 1 | 2004年10月13日 06:10午後 |
![]() |
|
|
LinkBack | スレッドツール | このスレッドを検索 | スレッドを評価 | 表示モード |
|
|
|
||||
|
共有メモリとリストの問題点
こんにちは、私は、共有メモリ内のリストには、この構造体のオブジェクトに行わせる必要があります:
コード:
typedef struct Obj{
char objname[20];
struct Obj *nextObj;
}Object
私は別のスレッドで(ここで文書を読んで- > 動的な共有メモリ )は、共有メモリをmalloc曽根の問題を与える 引用:
私はこの方法でオブジェクトを共有しようとしました: コード:
Obj *head; //pointer to the head of my FILLED list int shmid; Obj *sh; ... shmid = shmget(SHMKEY,(sizeof(Obj)*10),0666|IPC_CREAT|IPC_EXCL); ... sh = (Obj *)shmat(shmid, 0, 0666); ... *sh = *head; よろしくご支援、ご利用いただきありがとうございます。 |
|
||||
|
ここで問題なの:このポインタは、 malloc ( )戻り値は、プロセスのアドレス空間にしていると呼ばれる地元のmalloc ( ) 。それらの値が別のプロセスのコンテキスト内で何を意味することはありません。したがって、共有メモリにそれらの数字を入れ、それを使用して別のプロセスからの未定義の動作が呼び出されます。恵まれている場合は、プログラムをクラッシュします。ラッキーではない場合は、ユーモアをCのどこか(ビット)は、超新星を起こす可能性があります。
そこで何を行う必要がある共有メモリの別のチャンクを割り当てることで、 " mallocを書く"と" "空きメモリのプールを使用すること。言い換えれば、あなたの小さなメモリアロケータを書くことがある/ deallocatorは、この共有メモリプールを使用して、その後からのオフセットを渡します。すべてのオブジェクトのため、この非常に些細なことだろうと同じです。 通知書私は言った"オフセット"ではなく"アドレス" 。私はどこで私が今までには何も保証は、共有メモリを異なるプロセスで同じアドレスが割り当てられることを読んだことは覚えていません。そのためには、リストに高いと仮定して、元の問題に戻りますつながるこれらの値を使用しています。ので、知的な方法で問題を処理する必要があります。 ( )任意のサイズの割り当てを処理する、または特定の(のみ) Objタイプのものを処理する構造体を、この一般的なことを書くことができます。いずれにしても素晴らしいですが、私は、一般的な記事を書いている運動をもっと教えると思います。 これはかなり簡単な作業ですが、そこにいくつかのことに注意されています。私はあなたの2つを行います: 1 )のみの1つのプロセスは、共有メモリプールを初期化することができます。他の起動まず、プールの初期化は、そのプロセスを起動します。そうでなければ、潜在的に複数のプロセスをプールトラッシングがあります。 イ)どのように発生する場合は、このプロセスの共有プールから何かを配分されている配分の中で、プールから何かを割り当てることも、この共有しようとすると、別のプロセスが中断されます。警告:この場合は間違って、悪いことは、どうなるあなたのお母さんがあなたのことを笑う。なお、一般的な場合のために協力する場合、別のプロセスのリストを操作しているが必ずしも知らないにも問題を引き起こすことができるのと同じ種類のリストにアクセスする。 もう1つのもの:あなたの記事で、あなたがありました: コード:
*sh = *head; HTH返答 |
|
||||
|
お返事に感謝
私は別の方法で..私の問題を解決しかし私もあなたのソリューションを試してみます 習うより慣れろ!しかしいくつかの他の質問/回答をしたいのですが私の知るがあります: 1 )私をあなたのユーモアに大声で、真剣に私は一人の距離が計算上ゼロにしてを分ける(私はブラックホールが嫌い)を実行xD笑ったのだ。 2 )私はこの方法で私の問題を解決: ( 7私のリストのオブジェクトの番号です) コード:
Obj *pp, *head;
...
..
if((shmid = shmget(SHMKEY, 7, 0777|IPC_CREAT|IPC_EXCL)) == -1){
perror("shmget");
exit(1);
}
if((sh = (Obj *)shmat(shmid, 0, 0777)) ==(Obj *) -1){
perror("shmat");
exit(1);
}
int a;
pp = head;
for(a=0; a<7; a++){
*(sh+a) = *pp;
pp = pp->next;
}
...
コード:
Obj *p, *List;
...
p=List;
for(a=0; a<7; a++){
*p=*(sh+a);
p=p->next;
}
...
3 )私は少しの共有メモリをめちゃめちゃにした。私は、私がどのように動作するものと仮定されたのです- (希望するため、人形を自分の言語レベルの英語を理解します)ここで、私のものを合わせることができる"ボックス" -など。しかし、もし私maaany問題を買ってあげるのポインタを内部にしてください。だから、私の方法( )としているputtedしたリストは長いリストとしては、もっと高い"""""文字列として""""" ( " "監視行動 ) 。例: コード:
if((shmid = shmget(SHMKEY, 7, 0777|IPC_CREAT|IPC_EXCL)) == -1){
perror("shmget");
exit(1);
( ... shmat .. ) Xは、真の価値を、私の場合はObjになります。それからobjの7サイズの各スロットがあります。 私は私の箱に詰めるとき、私は個別にshに共有メモリを介して移動するのスロットを埋める+ +ではなく、次のobjへのポインタ。 私の意見ですよね?または完全に間違ってか! ![]() おかげで再び ![]() |
|
||||
|
これは問題があります:
コード:
Obj *pp, *head; ... pp = head; /* other stuff involving pp, which is wrong because pp was set to an unknown value. */ 私はあなたに何が必要があると思う(箱、おそらく) 、バラバラに(それを分ける必要な数の絵を描く)と入力し、ポインタを表す矢印を描画オブジェクトをしている。 不運にしているため、あなたのコードは、正しいの下に動作しませんが、動作します。 |