cygwin中混合C / FORTRAN程序的共享内存处理

问题描述 投票:0回答:1

我将FORTRAN / C中的程序移植到cygwin,该程序依赖于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)

尽管已创建的内存部分qazxsw poi的总大小已打开,但cptr后面的内存量在cygwin上太小(但在Linux中没有),并且程序因较大的数据集而崩溃

npages

认为它可能与C与FORTRAN代码中指针的不同底层数据类型(整数vs char / float)有关,我尝试将FORTRAN例程中指针的类型定义更改为

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

它全部编译和运行,但是给出完全相同的运行时错误,并没有解释为什么程序在Linux中有效。

不知道我在这一点上能做什么(要注意什么,在哪里得到帮助),所以投入赞赏。

编辑

事实证明,在标有代码的部分中

byte pptr       
real*4 cptr      

有一条线

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

以前定义为shmid = shmget(key, PAGESIZE, IPC_ALLOC); PAGESIZE=512的参数导致了这个问题。 Linux中的调用似乎返回与密钥相关联的shmid而不执行内存分配,而在cygwin中,它会导致内存分配到4k的限制,从而导致seg错误。

c linux cygwin fortran shared-memory
1个回答
0
投票

这个问题是由cygwin程序员解决的。它涉及一个cygwin1 DLL的补丁,虽然可以通过传递有关shm部分大小的其他信息来解决。

© www.soinside.com 2019 - 2024. All rights reserved.