![](/img/trans.png)
[英]Issue with alternating between parent and child process using POSIX semaphore functions
[英]How to return cJSON fragments by process parent using POSIX?
tl;博士:我如何配置cJSON在子進程中分配內存,以便父級可以看到生成的結構?
我有一個請求,其中列出了要為其生成摘要並作為JSON返回的多個產品。 目前,我的代碼是單線程的,並使用cJSON庫來編寫和編組JSON。
由於摘要的計算量很大(用戶要求將某些計算作為摘要的一部分進行),因此我想對每個請求的產品進行fork(2)
,然后將其獲取,處理並匯總為cJSON_Object
(從技術cJSON*
但是“構造函數”是cJSON_CreateObject
),然后讓父線程等待所有子級將其cJSON_Object
對象返回以將其連接在一起,執行一些后處理,然后最后將其編組為字符串以返回。 由於進行了后期處理,我想將cJSON_Object
返回給父cJSON_Object
而不是讓子線程返回字符串。
現在,我看到cJSON.h:144 CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks)
接受一個cJSON.h:125 struct internal_hooks
,它允許您指定自定義malloc()
和free()
實現...如果我能找到分配共享內存的版本...並共享相同的類型。 我發現的最接近的是shmalloc
/ shfree
但這是來自OpenMPI庫的,對於看起來應該是簡單的工作線程來說似乎有點過頭了...
現在, 這是我 遇到的問題 , 如何將cJSON結構圖從子進程返回到父進程 ?
我附上了我認為最好的(盡管未經測試)的解決方案,以解決此問題。
PS-優選地,該解決方案將其自身限制為POSIX API,但僅Linux是可以接受的,並且最后的方法是附加庫。
我還沒有測試過,這似乎有點黑,但這是我到目前為止所想到的最好的:
我確實找到了shmget(3)
。 類型簽名不兼容,所以我認為可以包裝它。 在每個孩子中,我可以生成一個唯一的整數用作key_t
,並分配足夠的內存以包含響應。 然后提供我自己的malloc()
,它只是從shmget
分配的塊中分配。 最后,通過exit(3)
調用將key_t
返回給父級。 父線程將從wait(3)
獲得key_t
的值,然后能夠獲取cJSON_Object
並將其與其他片段組合。
因此,答案將是在子項上啟動: shmget
一些內存,然后編寫一個malloc()
兼容函數my_malloc()
分配該shmget
ed內存,並具有指向my_malloc()
的指針,該指針通過傳遞給cJSON_InitHooks
struct internal_hooks
。
不幸的是,這並不像在共享內存段中分配一些對象那么簡單。 cJSON
對象是鏈接的數據結構,考慮到JSON對象可以由嵌套列表和哈希組成,這並不奇怪。
typedef struct cJSON
{
/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON *next;
struct cJSON *prev;
/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
struct cJSON *child;
...
}
這種結構的指針,以及在共享內存區域中存儲指針可能不是一個好主意。 每個進程都有其自己的虛擬內存空間,並且共享內存段可能不會在兩個進程中都映射到相同的地址。 如果是這種情況,相同的指針值將指向一個地址空間中的有效對象,但是在其他地址空間中,它可能指向垃圾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.