[英]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=512
和IPC_ALLOC=0
,導致了此問題。 在Linux中,該調用似乎在不執行內存分配的情況下返回了與鍵關聯的shmid,而在cygwin中,它導致將內存分配限制為4k,從而導致seg錯誤。
cygwin程序員解決了這個問題。 盡管可以通過傳遞有關shm節大小的其他信息來解決該問題,但它涉及cygwin1 DLL的補丁。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.