2011-03-04 41 views
1
program x 
    character(len=1024) :: foo 
    integer:: ret 

    foo = 'ls' 
    call system(foo, ret) 
end program 

該程序崩潰與SIGSEGV ifif。簡單的fortran程序使用系統崩潰()

forrtl: severe (174): SIGSEGV, segmentation fault occurred 
Image    PC    Routine   Line  Source    
a.out    0000000100000F0B Unknown    Unknown Unknown 
a.out    0000000100000EAA Unknown    Unknown Unknown 
a.out    0000000100000E8B Unknown    Unknown Unknown 
a.out    0000000100000E0C Unknown    Unknown Unknown 
a.out    0000000100000DA4 Unknown    Unknown Unknown 

GDB:

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: 13 at address: 0x0000000000000000 
0x0000000100000f0a in allocCstr() 
(gdb) bt 
#0 0x0000000100000f0a in allocCstr() 
#1 0x0000000100000eaa in system_() 
#2 0x0000000100000e0c in main() 

ifort --version

ifort (IFORT) 11.1 20100806 
Copyright (C) 1985-2010 Intel Corporation. All rights reserved. 

這是一個錯誤或功能?

回答

3

我可以重現你看到的錯誤,如果我複製你的代碼(Linux,ifort 11.0 20090131)。但是,對英特爾Fortran編譯器手冊的檢查表明它是一個函數而不是子例程。如果我將代碼修改爲:

program x 
    character(len=1024) :: foo 
    integer    :: ret 

    foo = 'ls' 
    ret = system(foo) 
end program x 

然後它成功運行。

2

那麼,這個工程在我的機器上(ifort,XP SP3)

CHARACTER(LEN=1024) :: FOO 
    INTEGER :: RET 

    FOO = 'dir' 
    CALL SYSTEM(FOO, RET) 
    READ(*,*) 

    END 

RET = SYSTEM(FOO) 

也適用於您所使用的相同ifort,Windows XP SP2

也。