The UNIX and Linux Forums  
Helloやアメリカ合衆国へようこそ! UNIXおよびLinuxフォーラム!訪問し、当社のグローバルコミュニティに参加いただきありがとうございます。

Go Back   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午後

Reply
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek を搭載 Powered by Google
 
LinkBack スレッドツール このスレッドを検索 スレッドを評価 表示モード
  #1固定リンク)  
Old 2009年6月28日
BeNdErR BeNdErR is offline
登録ユーザー
  
 

参加日: 2009年6月
投稿数: 4
共有メモリとリストの問題点

こんにちは、私は、共有メモリ内のリストには、この構造体のオブジェクトに行わせる必要があります:

コード:
typedef struct Obj{
char objname[20];
struct Obj *nextObj;
}Object
私は(例えば) 10要素で、リストを埋めているときに共有メモリ内の別のプロセスを私が読むことをしようとする最初のレコードを読むセグメンテーションフォールト後に..なる
私は別のスレッドで(ここで文書を読んで- > 動的な共有メモリ )は、共有メモリをmalloc曽根の問題を与える
引用:
linked_list_headerを作成する場合はmallocと呼ば- >のPTR 、 mallocして、アドレスが返されるの呼び出しには非公開です 呼び出しは、 malloc (プロセス) プロセス。ノードと同じ- >バッファ。あなたがこのようなことを割り当てることがあるだろう"と手で" 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;
おそらくI 、または多分私は完全に間違っている何かを逃す...どのように共有する"の手で" mallocを呼び出すことなくObjを割り当てることができますか?

よろしくご支援、ご利用いただきありがとうございます。
  #2固定リンク)  
Old 2009年6月29日
mgessner mgessner is offline
登録ユーザー
  
 

参加日: 2007年10月
投稿: 50
ここで問題なの:このポインタは、 malloc ( )戻り値は、プロセスのアドレス空間にしていると呼ばれる地元のmalloc ( ) 。それらの値が別のプロセスのコンテキスト内で何を意味することはありません。したがって、共有メモリにそれらの数字を入れ、それを使用して別のプロセスからの未定義の動作が呼び出されます。恵まれている場合は、プログラムをクラッシュします。ラッキーではない場合は、ユーモアをCのどこか(ビット)は、超新星を起こす可能性があります。

そこで何を行う必要がある共有メモリの別のチャンクを割り当てることで、 " mallocを書く"と" "空きメモリのプールを使用すること。言い換えれば、あなたの小さなメモリアロケータを書くことがある/ deallocatorは、この共有メモリプールを使用して、その後からのオフセットを渡します。すべてのオブジェクトのため、この非常に些細なことだろうと同じです。

通知書私は言った"オフセット"ではなく"アドレス" 。私はどこで私が今までには何も保証は、共有メモリを異なるプロセスで同じアドレスが割り当てられることを読んだことは覚えていません。そのためには、リストに高いと仮定して、元の問題に戻りますつながるこれらの値を使用しています。ので、知的な方法で問題を処理する必要があります。

( )任意のサイズの割り当てを処理する、または特定の(のみ) Objタイプのものを処理する構造体を、この一般的なことを書くことができます。いずれにしても素晴らしいですが、私は、一般的な記事を書いている運動をもっと教えると思います。

これはかなり簡単な作業ですが、そこにいくつかのことに注意されています。私はあなたの2つを行います:

1 )のみの1つのプロセスは、共有メモリプールを初期化することができます。他の起動まず、プールの初期化は、そのプロセスを起動します。そうでなければ、潜在的に複数のプロセスをプールトラッシングがあります。

イ)どのように発生する場合は、このプロセスの共有プールから何かを配分されている配分の中で、プールから何かを割り当てることも、この共有しようとすると、別のプロセスが中断されます。警告:この場合は間違って、悪いことは、どうなるあなたのお母さんがあなたのことを笑う。なお、一般的な場合のために協力する場合、別のプロセスのリストを操作しているが必ずしも知らないにも問題を引き起こすことができるのと同じ種類のリストにアクセスする。

もう1つのもの:あなたの記事で、あなたがありました:

コード:
*sh = *head;
これは間違っている: a )お客様の内容を変更するにはshにしないと、とb )ではなく、その逆でshに頭を指すようにします。

HTH返答
  #3固定リンク)  
Old 2009年6月29日
BeNdErR BeNdErR is offline
登録ユーザー
  
 

参加日: 2009年6月
投稿数: 4
Thumbs up

お返事に感謝 私は別の方法で..私の問題を解決しかし私もあなたのソリューションを試してみます 習うより慣れろ!

しかしいくつかの他の質問/回答をしたいのですが私の知るがあります:

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);
今私は、箱Xの7スロットの次元を加えています。かつて私は、メモリを取り付ける
( ... shmat .. ) Xは、真の価値を、私の場合はObjになります。それからobjの7サイズの各スロットがあります。
私は私の箱に詰めるとき、私は個別にshに共有メモリを介して移動するのスロットを埋める+ +ではなく、次のobjへのポインタ。

私の意見ですよね?または完全に間違ってか!


おかげで再び
  #4固定リンク)  
Old 2009年6月30日
mgessner mgessner is offline
登録ユーザー
  
 

参加日: 2007年10月
投稿: 50
これは問題があります:
コード:
Obj *pp, *head;
...
pp = head;

/* other stuff involving pp, which is wrong because pp was set to an unknown value. */
頭を初期化されることはなかった。使用する前に、いつものポインタを初期化する必要があります。のいずれかがNULL (この場合は) 、または何かをしなければならないポイントを解除しない場合する必要があります。

私はあなたに何が必要があると思う(箱、おそらく) 、バラバラに(それを分ける必要な数の絵を描く)と入力し、ポインタを表す矢印を描画オブジェクトをしている。

不運にしているため、あなたのコードは、正しいの下に動作しませんが、動作します。
  #5固定リンク)  
Old 2009年6月30日
BeNdErR BeNdErR is offline
登録ユーザー
  
 

参加日: 2009年6月
投稿数: 4
待って、私は私の頭*リスト全体の長さと言うのを忘れた..だから、少なくともそれぞれの値がNULLポインタを初期化しましたか?
  #6固定リンク)  
Old 2009年6月30日
mgessner mgessner is offline
登録ユーザー
  
 

参加日: 2007年10月
投稿: 50
\u003d頭のPPの設定が、あなたの頭の設定例では何もありません。
  #7固定リンク)  
Old 2009年6月30日
BeNdErR BeNdErR is offline
登録ユーザー
  
 

参加日: 2009年6月
投稿数: 4
はい、私の頭の部分の長さはどこの値が設定されていないためでした thougth良いだけで頭のコードを投稿するのではなく、完全に..私のリスト全体の長へのポインタをされていたと言う
Reply

ブックマーク

スレッドツール このスレッドを検索
このスレッドを検索

高度な検索
表示モード このスレッド
このスレッド

投稿ルール
あなた ことができない。 新しいスレッドを投稿
あなた ことができない。 返信の投稿
あなた ことができない。 添付ファイルの投稿
あなた ことができない。 自分の投稿を編集

BBコード なる 〜の上に
スマイリー なる 〜の上に
[イメージ] コードは 〜の上に
HTMLコードは、 オフ
トラックバック なる 〜の上に
ピングバック なる 〜の上に
Refbacks なる 〜の上に




すべてGMT -4です。現在の時刻は 04:29午後


提供: vBulletin、著作権© 2000 - 2006、Jelsoft企業株式会社。言語翻訳による電源
vBCredits v1.4著作権© 2007 - 2008 、 PixelFXスタジオ
は、 UNIXおよびLinuxフォーラムのコンテンツ著作権© 1993 〜 2009 。すべての権利を管理しReserved.Ad RedTyger

コンテンツ関連のURLで vBSEO 3.2.0