簡體   English   中英

cygwin中混合C / FORTRAN程序的共享內存處理

[英]Shared memory handling for mixed C/FORTRAN program in cygwin

我正在將cygwin移植到FORTRAN / C中依賴C例程的程序來創建一個共享內存區域,該內存區域允許各種獨立的FORTRAN例程共享數據。 程序可以使用g77 / gcc編譯器在Linux上編譯並正常運行。 我正在使用gfortran / gcc(4.8.3)在cygwin 1.7.33-2(0.280 / 5/3)上進行編譯。

一個C例程創建用戶定義大小的共享內存部分。 盡管我必須在sys / shm.h文件中添加兩行,但這似乎工作得很好:

#define SHM_R        0400        /* or S_IRUGO from <linux/stat.h> */
#define SHM_W        0200        /* or S_IWUGO from <linux/stat.h> */

shm庫函數似乎返回合理的信息(頁面大小)。

然后,每個FORTRAN例程都調用C例程來查找共享內存,而C例程將返回指向該節中用於不同類型數據的兩個位置的指針:

#define PAGESIZE    1024

int findshm(
    char    **pptr, /* Address of the parameter pointer */
    float   **cptr) /* Address of the data pointer */

    .... calls to shm library functions ....
shmaddr = 0;
p = shmat(shmid, shmaddr, (SHM_R | SHM_W)); 

/* Store the pointers */
*pptr = p;
*cptr = (float *) (p + PAGESIZE);

return npages;

調用FORTRAN代碼如下所示:

integer pptr, cptr       
integer npages                     
npages = findshm(pptr, cptr)

盡管創建的內存部分npages的總大小是可以的,但是在cygwin上cptr之后的內存量太小(在Linux中不是),並且對於較大的數據集,程序崩潰

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

考慮到它可能與C和FORTRAN代碼中的指針的不同基礎數據類型有關(整數與char / float),我嘗試將FORTRAN例程中的指針的類型定義更改為

byte pptr       
real*4 cptr      

並且所有這些都可以編譯和運行,但是給出了完全相同的運行時錯誤,並且沒有解釋為什么該程序可以在Linux上運行。

不確定此時我能做什么(要尋找的東西,在哪里獲得幫助),因此感謝您的投入。

編輯

事實證明,在代碼部分

    .... calls to shm library functions ....

有一條線

shmid = shmget(key, PAGESIZE, IPC_ALLOC);

使用先前定義為PAGESIZE=512IPC_ALLOC=0 ,導致了此問題。 在Linux中,該調用似乎在不執行內存分配的情況下返回了與鍵關聯的shmid,而在cygwin中,它導致將內存分配限制為4k,從而導致seg錯誤。

cygwin程序員解決了這個問題。 盡管可以通過傳遞有關shm節大小的其他信息來解決該問題,但它涉及cygwin1 DLL的補丁。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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