Linux share memory存取權限問題 - Linux

Caitlin avatar
By Caitlin
at 2009-10-24T11:18

Table of Contents

※ [本文轉錄自 C_and_CPP 看板]

作者: nagahara (Nagahara) 看板: C_and_CPP
標題: [問題] share memory存取權限問題
時間: Thu Oct 22 21:54:52 2009

有一個資料結構長這樣

typedef struct{
int head;
int tail;
int element_size;
void* array;
}Queue;

假設process A create一塊share memory是sizeof(Queue)+ARRAY_SIZE

這塊空間用一個Queue的指標接收:

Queue* queue = shmget(...);

queue->array指到queue下面多create出來的那塊空間:

queue->array = (char*)queue + sizeof(Queue);

Process A存取Queue都沒問題,

Process B用一個Queue*去get這塊空間之後,可以存取head tail element_size

但是要取array裡面的值時,卻得到亂碼,不然就會segment fault,

請問這是什麼原因呢? 要怎麼做才可以存取array的值呢? 謝謝

--
Tags: Linux

All Comments

Candice avatar
By Candice
at 2009-10-27T04:53
Linux記憶體管理方式造在process B得到的array位址還需remap
Kelly avatar
By Kelly
at 2009-10-30T20:03
比較好的方式就是不要在share memory放指標,直接擺陣列進來
Sandy avatar
By Sandy
at 2009-11-04T05:26
那麼Queue Node的size是動態配置 不放指標要怎麼實作呢
Hazel avatar
By Hazel
at 2009-11-07T17:54
可以用啊,processB存取share memory中指標先算出真實位址即可
Agnes avatar
By Agnes
at 2009-11-08T09:06
要先搞清楚指標只是一個位址,而不同程式在虛擬位址看到的位址
Andrew avatar
By Andrew
at 2009-11-09T10:36
未必是同一個,除非都轉成真實的位址,則可指到同一陣列
Lydia avatar
By Lydia
at 2009-11-11T21:21
感謝 找到解決方法了

桌面用ubuntu,Server用CentOS?

Jake avatar
By Jake
at 2009-10-24T02:11
andlt;原文恕刪andgt; 就說說我自己個人的例子吧。 在我自己的NB上都只開Linux,安裝的是openSUSE 11.1 x86_64的版本。 我覺得很好用阿,平常會用到的功能也不外乎是那幾樣。 FireFox、Pidgin、xmms、OpenOffice、minicom、rdesktop... ...

ubuntu 9.04 已經可以用Windows7了嗎?

Leila avatar
By Leila
at 2009-10-24T00:27
我講的當然是 virture box 之類的軟體... 目前有人試過嗎?? 另外我很期待 10.04板本 - ...

為什麼新增使用者到某特定群組後會出現錯誤?

Oliver avatar
By Oliver
at 2009-10-23T22:56
為什麼我建立了幾個使用者後 將其中一個使用者的UID改成0 在登入這個使用者之後 提示符號會變成bash-4.0# 而不是登入者的名稱呢!? -- - ...

桌面用ubuntu,Server用CentOS?

Wallis avatar
By Wallis
at 2009-10-23T20:37
看了Joe大那麼清楚的講解 我只想講 為什麼SLES 11的InfiniBand的opensmb的執行檔可以寫錯................ 身為一家做企業伺服器級的OS的廠商,這種小地方出問題.... 實在讓我很汗顏 另外SLES 10 SP3的netxen driver有問題會讓有netxe ...

system(mv source dst)失敗

Skylar Davis avatar
By Skylar Davis
at 2009-10-23T19:02
今天在寫一個程式,用的是c 程式執行環境是linux 編譯器用 gcc 我用 system希望把file從一個dir搬到另一個dir 程式寫法如下 system(and#34;mv dir/file dir2and#34;); 我把這行指令在linux底下執行過一次,確定是可以的, 可是寫在程式 ...