在CSDN上,有個朋友提了這么一個問題,大概意思是:他在進程里fork出一個子進程,然后發信號同時附加信息給子進程,子進程收到信號后把收到的信息打印出來,同時發一個信號和信息給父進程。結果打印的時候打印出空值。
問題所在是因為,Linux子進程雖然是父進程創建的,但它們之間的數據存放的地址空間是相互獨立的。在父進程中給全局變量賦值后子進程中依然為空值。只有線程才共享資源。
(一)解決方法我也在帖子中給出了,我用的是mmap來實現數據的共享。
(二)當然也可以用POSIX定義的sigqueue函數,它允許進程發送帶附加信息的信號。
typedefstruct{ charps[100]; //父進程想發給子進程的信息 charcs[100]; //子進程想發給父進程的消息 }SharedData; SharedData*share_map; share_map=(SharedData*)mmap(NULL,sizeof(SharedData),PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS,-1,0);
(三)后來我在IBM developerWorks上找到了一個用SystemV實現內存共享的方法,這種方法效率很高而且也很簡單。在帖子后面,我也給出了SystemV實現的方法。