簡體   English   中英

如何使用POSIX通過進程父級返回cJSON片段?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM