从fortran调用C的open()函数时文件权限不正确

jit*_*hsk 0 fortran gfortran fortran90

我有一个fortran程序调用C函数并使用open()打开一个文件

main.f90时:

PROGRAM TEST

    integer                        :: oflag, mode

    !Set oflag to O_CREAT|O_RDWR
    oflag = 66   
    mode = 600 

    call test2("test.txt", oflag, mode)

END PROGRAM
Run Code Online (Sandbox Code Playgroud)

test.c的:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>

#pragma weak test2_     = test2
#pragma weak test2__    = test2
#pragma weak TEST2      = test2

void test2(char* filename, int* flag, int* mode)
{
    int fd; 
    if(-1 == (fd = open(filename, *flag, *mode)))
        puts("Returned -1");
}
Run Code Online (Sandbox Code Playgroud)

我编译为:

gcc -c test.c
gfortran main.f90 test.o
Run Code Online (Sandbox Code Playgroud)

当我运行程序时,它会创建文件test.txt,但权限不正确:

---x--x--T 1 xyz users    0 2011-09-24 16:40 test.txt
Run Code Online (Sandbox Code Playgroud)

什么时候应该

-rw------- 1 xyz users    0 2011-09-24 16:45 test.txt
Run Code Online (Sandbox Code Playgroud)

如果我从另一个C程序调用此函数,它工作正常.有人可以指出出了什么问题吗?

规格:64位linux GNU Fortran(SUSE Linux)4.5.0,GCC(SUSE Linux)4.5.0

谢谢,Kshitij

Dav*_*rtz 5

您的常量是错误的,因为权限通常以八进制指定.试试这个程序:

#include <stdio.h>
#include <fcntl.h>

int main(void)
{
 printf("oflag=%d mode=%d\n", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

oflag = 66 mode = 384

600八进制equals 384十进制.

  • 你的C调用是什么样的?如果使用"0600",则前导"0"指定八进制(参见[C标准的6.4.4.1节](http://c0x.coding-guidelines.com/6.4.4.1.html)). (3认同)