添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

可以在 Sun Studio 手册页的第 3f 节中找到其他手册页。例如,执行 man -s 3f 命令将显示 access() 函数的手册页。在本手册中,手册页参考均表示为 manpagename ( section )。例如,有关 access() 函数的手册页参考表示为 access (3f),有关 Fortran 95 编译器的手册页参考表示为 f95 (1)。

1.4.1 abort :终止并写入核心转储文件

该子例程的调用方式如下所示:

abort 刷新 I/O 缓冲区,然后中止进程,可能会在当前目录中生成 核心转储 文件内存转储。有关限制或抑制核心转储的信息,请参见 limit (1)。

1.4.2 access :检查文件权限或文件是否存在

该函数的调用方式如下所示:

access 确定是否可以使用 mode 指定的权限访问文件 name 。如果可以使用 mode 指定的权限成功访问文件,access 将返回零。另请参见 gerror (3F),了解有关错误代码的信息。

可以将 mode 设置为 r w x 中的一个或多个(以任何顺序或任意组合),也可以为空白,其中 r w x 的含义如下:

      INTEGER*4  access, status
      status = access ( ’taccess.data’, ’rw’ )
      if ( status .eq. 0 ) write(*,*) "ok"
      if ( status .ne. 0 ) write(*,*) ’cannot read/write’, status

示例 2:测试文件是否存在:

      INTEGER*4  access, status
      status = access ( ’taccess.data’, ’ ’ )    ! blank mode
      if ( status .eq. 0 ) write(*,*) "file exists"
      if ( status .ne. 0 ) write(*,*) ’no such file’, status

1.4.3 alarm :在指定的时间后调用子例程

该函数的调用方式如下所示:

write(*,*) i nseconds = alarm ( time, sbrtn ) do n = 1,100000 ! Wait until alarm activates sbrtn. r = n ! (any calculations that take enough time) x=sqrt(r) end do write(*,*) i subroutine sbrtn common / alarmcom / i i = 3 ! Do no I/O in this routine. return

另请参见: alarm (3C)、 sleep (3F) 和 signal (3F)。注意以下限制条件:

子例程无法将自己的名称传递给 alarm

有关对位字段进行操作的其他函数,另请参见 1.4.36 mvbits :移动位字段 以及第 2 章和第 3 章。

1.4.4.1 用法: and or xor not rshift lshift

对于内函数:

word word1 word2 nbits 都是整型输入参数。这些函数是编译器内联扩展的内函数。返回值的数据类型是第一个参数的数据类型。

不测试 nbits 的值是否合理。

示例: and or xor not

demo% cat tandornot.f
        print 1, and(7,4), or(7,4), xor(7,4), not(4)
 1      format(4x ’and(7,4)’, 5x ’or(7,4)’, 4x ’xor(7,4)’,
     1         6x ’not(4)’/4o12.11)
demo% f95 tandornot.f
demo% a.out
    and(7,4)     or(7,4)    xor(7,4)      not(4)
 00000000004 00000000007 00000000003 37777777773
demo%

示例: lshift rshift

integer*4 lshift, rshift print 1, lshift(7,1), rshift(4,1) 1 format(1x ’lshift(7,1)’, 1x ’rshift(4,1)’/2o12.11) demo% f95 tlrshift.f demo% a.out lshift(7,1) rshift(4,1) 00000000016 00000000002 demo%

1.4.4.2 用法: bic bis bit setbit

对于子例程和函数

bitnum state word 都是 INTEGER*4 输入参数。函数 bit () 的返回值是逻辑值。

各个位都进行编号,0 位表示最低有效位,31 位表示最高有效位。

bic bis setbit 是外部子例程, bit 是外部函数。

示例 3: bic bis setbit bit

print 3, word 3 format(’after bis(2,word)’, o12.11) call setbit( bitnum, word, state ) print 4, word 4 format(’after setbit(2,word,0)’, o12.11) print 5, bit(bitnum, word) 5 format(’bit(2,word)’, L ) < output > word 00000000007 after bic(2,word) 00000000003 after bis(2,word) 00000000007 after setbit(2,word,0) 00000000003 bit(2,word) F

1.4.5 chdir :更改缺省目录

该函数的调用方式如下所示:

另请参见: chdir (2)、 cd (1) 和 gerror (3F),了解有关错误代码的信息。

路径名长度不能超过 <sys/param.h> 中定义的 MAXPATHLEN 值。路径可以是相对路径,也可以是绝对路径。

使用该函数可能会导致按单元查询失败。

某些 Fortran 文件操作会按文件名重新打开文件。执行 I/O 操作时使用 chdir 可能会导致运行时系统不能跟踪使用相对路径名创建的文件。(包括使用打开语句创建但没有文件名的文件)。

1.4.6 chmod :更改文件的模式

该函数的调用方式如下所示:

另请参见: chmod (1) 和 gerror (3F),了解有关错误代码的信息。

路径名长度不能超过 <sys/param.h> 中定义的 MAXPATHLEN 值。路径可以是相对路径,也可以是绝对路径。

1.4.7 date :获取以字符串表示的当前日期


注 –

由于该例程只返回两位数值的年份,因此它存在“2000 年安全”问题。在 1999 年 12 月 31 日之后,使用该例程输出计算日期差异的程序可能无法正常工作。如果执行使用此 date() 例程的程序,第一次调用该例程时会显示运行时警告消息,向用户发出报警。请参见另一个可换用的例程 date_and_time()

该子例程的调用方式如下所示:

返回的字符串 c 的格式为 dd-mmm-yy ,其中 dd 表示两位数的当月日期, mmm 表示三个字母的月份缩写, yy 表示两位数的年份(因此存在 2000 年安全问题!)。

示例: date

demo% f95 dat1.f demo% a.out Computing time differences using the 2 digit year from subroutine date is not safe after year 2000. The date today is: 9-Jan-02 demo%

另请参见 idate() date_and_time()

1.4.7.1 date_and_time :获取日期和时间

这是一个 2000 年安全的 Fortran 95 内例程。

子例程 date_and_time 返回实时时钟和日期的相关数据。返回数据包括本地时间以及本地时间与通用协调时间 (Universal Coordinated Time, UTC) 之间的时差,通用协调时间也称为格林威治标准时间 (Greenwich Mean Time, GMT)。

子例程 date_and_time() 的调用方式如下:

character*10 b(3) call date_and_time(b(1), b(2), b(3), date_time) print *,’date_time array values:’ print *,’year=’,date_time(1) print *,’month_of_year=’,date_time(2) print *,’day_of_month=’,date_time(3) print *,’time difference in minutes=’,date_time(4) print *,’hour of day=’,date_time(5) print *,’minutes of hour=’,date_time(6) print *,’seconds of minute=’,date_time(7) print *,’milliseconds of second=’,date_time(8) print *, ’DATE=’,b(1) print *, ’TIME=’,b(2) print *, ’ZONE=’,b(3)

2000 年 2 月 16 日在美国加利福尼亚的一台计算机上运行该例程时,输出结果如下所示:

1.4.8 dtime etime :已用的执行时间

这两个函数的返回值都是已用时间(如果为 -1.0,表示出现错误)。返回的时间以秒数表示。

缺省情况下,Fortran 95 使用的 dtime etime 版本使用系统的低精度时钟。该精度是百分之一秒。但是,如果在 Sun OS TM 操作系统实用程序 ptime (1) ( /usr/proc/bin/ptime) 下运行程序,则使用高精度时钟。

1.4.8.1 dtime :自上次调用 dtime 后已用时间

对于 dtime ,已用时间为:

第一次调用:自开始执行后已用时间

demo% cat tdtime.f
       real e, dtime, t(2)
       print *, ’elapsed:’, e, ’, user:’, t(1), ’, sys:’, t(2)
       do i = 1, 10000
        k=k+1
       end do
       e = dtime( t )
       print *, ’elapsed:’, e, ’, user:’, t(1), ’, sys:’, t(2)
demo% f95 tdtime.f
demo% a.out
elapsed: 0.0E+0 , user: 0.0E+0 , sys: 0.0E+0
 elapsed: 0.03 , user: 0.01 , sys: 0.02
demo%

1.4.8.2 etime :自开始执行后已用时间

对于 etime ,已用时间为:

单处理器执行 调用进程的 CPU 时间

demo% cat tetime.f
       real e, etime, t(2)
       e = etime(t)         !  Startup etime - do not use result
       do i = 1, 10000
        k=k+1
       end do
       e = etime( t )
       print *, ’elapsed:’, e, ’, user:’, t(1), ’, sys:’, t(2)
demo% f95 tetime.f
demo% a.out
elapsed: 0.02 , user: 0.01 , sys: 0.01
demo%

另请参见 times (2) 和《 Fortran 编程指南 》。

1.4.9 exit :终止进程并设置状态

该子例程的调用方式如下所示:

exit 刷新并关闭进程中的所有文件,然后通知父进程(如果它在执行 wait )。

status 的低 8 位可用于父进程。此时,这 8 位左移 8 位,其他所有位均为零。(因此, status 应介于 256 到 65280 之间。)该调用从不返回任何值。

执行 C 函数 exit 时,可能会在系统最终 ' exit ' 之前执行清除操作。

调用 exit 时不使用参数会导致出现编译时警告消息,并自动将零作为参数。另请参见: exit (2)、 fork (2)、 fork (3F)、 wait (2) 和 wait (3F)。

1.4.10 fdate :返回以 ASCII 字符串表示的日期和时间

该子例程或函数的调用方式如下所示:

flush 函数将逻辑单元 lunit 的缓冲区的内容刷新到关联文件中。逻辑单元 0 和逻辑单元 6 都与控制台终端关联时,该函数对它们特别有用。如果出现错误,该函数返回正的错误编号,否则返回零。

另请参见 fclose (3S)。

1.4.12 fork :创建当前进程的副本

该函数的调用方式如下所示:

fork 函数创建调用进程的副本。两个进程之间的唯一区别在于返回给其中一个进程(称为 进程)的值是副本的进程 ID。副本通常称为 进程。返回给子进程的值将为零。

为了避免外部文件中的 I/O 缓冲区内容重复,在执行 fork 操作之前,会刷新所有已开放供写入的逻辑单元。

示例: fork()

目前尚未提供对应的 exec 例程,这是因为没有一种令人满意的方法能够在整个 exec 例程中保持开放的逻辑单元。但是,可以使用 system (3F) 执行 fork/exec 的常用函数。另请参见: fork (2)、 wait (3F)、 kill (3F)、 system (3F) 和 perror (3F)。

1.4.13 fseek ftell :确定文件的位置和复位文件

fseek ftell 是用于实现文件复位的例程。 ftell 返回文件的当前位置,以距文件开头的字节偏移量表示。在程序中后面某处, fseek 可以使用此保存的偏移值,将文件复位到原来位置以便读取。

1.4.13.1 fseek :将文件复位到逻辑单元中

该函数的调用方式如下所示:


注 –

对于后续文件,在调用 fseek 后面执行输出操作(例如 WRITE )会导致 fseek 位置后面的所有数据记录被删除,并替换为新的数据记录(以及文件结束标记)。只有在使用直接访问文件时,才能将记录重新写入到位。

示例: fseek() -将 MyFile 复位到距开头两个字节处

        INTEGER*4 fseek, lunit/1/, offset/2/, from/0/, n
        open( UNIT=lunit, FILE=’MyFile’ )
        n = fseek( lunit, offset, from )
        if ( n .gt. 0 ) stop ’fseek error’

示例:同上,但在 64 位环境中,使用 -m64 编译:

        INTEGER*4 fseek, lunit/1/,  from/0/, n
        INTEGER*8 offset/2/
        open( UNIT=lunit, FILE=’MyFile’ )
        n = fseek( lunit, offset, from )
        if ( n .gt. 0 ) stop ’fseek error’

1.4.13.2 ftell:返回文件的当前位置

该函数的调用方式如下所示:

另请参见 fseek(3S) 和 perror(3F) 以及 fseeko64(3F) 和 ftello64(3F)。

1.4.14 fseeko64ftello64:确定大型文件的位置和复位大型文件

fseeko64ftello64fseekftell 的“大型文件”版本。它们采用并返回 INTEGER*8 的文件位置偏移值。(“大型文件”是指大于 2 GB 的文件,因此字节位置必须以 64 位整型值表示。)可使用这些函数确定大型文件的位置和/或复位大型文件。

1.4.14.1 fseeko64:将文件复位到逻辑单元中

该函数的调用方式如下所示:


注 –

对于后续文件,在调用 fseeko64 后执行输出操作(例如 WRITE)会导致 fseeko64 位置后面的所有数据记录被删除,并替换为新的数据记录(以及文件结束标记)。只有在使用直接访问文件时,才能将记录重新写入到位。

示例:fseeko64()-将 MyFile 复位到距开头两个字节处:

       INTEGER fseeko64, lunit/1/, from/0/, n
       INTEGER*8 offset/200/
       open( UNIT=lunit, FILE=’MyFile’ )
       n = fseeko64( lunit, offset, from )
       if ( n .gt. 0 ) stop ’fseek error’

1.4.14.2 ftello64:返回文件的当前位置

该函数的调用方式如下所示:

1.4.16 getcfgetc:获取下一个字符

getcfgetc 从输入流中获取下一个字符。请勿将这些例程的调用与相同逻辑单元中进行的正常 Fortran I/O 混在一起。

1.4.16.1 getc:从 stdin 中获取下一个字符

该函数的调用方式如下所示:

demo% a.out
ab            Program reads letters typed in
0 141         Program outputs status and octal value of the characters entered
0 142            141 represents ’a’, 142 is ’b’
0 012            012 represents the RETURN key
^D               terminated by a CONTROL-D.
-1 377        Next attempt to read returns CONTROL-D
demo%

对于逻辑单元,请勿将正常的 Fortran 输入与 getc() 混在一起。

1.4.16.2 fgetc:从指定逻辑单元中获取下一个字符

该函数的调用方式如下所示:

对于逻辑单元,请勿将正常的 Fortran 输入与 fgetc() 混在一起。

另请参见:getc(3S)、intro(2) 和 perror(3F)。

1.4.17 getcwd:获取当前工作目录的路径

该函数的调用方式如下所示:

另请参见:chdir(3F)、perror(3F) 和 getwd(3)。

注意:路径名长度不能超过 <sys/param.h> 中定义的 MAXPATHLEN 值。

1.4.18 getenv:获取环境变量值

该子例程的调用方式如下所示:

enameevalue 的大小必须足够大,以便能容纳相应的字符串。

如果 evalue 太短而不能容纳整个字符串值,则字符串将被截断以符合 evalue

子例程 getenv 在环境列表中搜索格式为 ename=evalue 的字符串,如果找到,则通过 evalue 返回值;否则在 evalue 中填入空白。

示例:使用 getenv() 打印 $SHELL 值:

       INTEGER*4 fildes, getfd, unitn/1/
       open( unitn, file=’tgetfd.data’ )
       fildes = getfd( unitn )
       if ( fildes .eq. -1 ) stop ’getfd: file not connected’
       write(*,*) ’file descriptor = ’, fildes

另请参见 open(2)

1.4.20 getfilep:获取外部单元编号的文件指针

该函数为:

该函数用于将标准的 Fortran I/O 与 C I/O 混在一起。此类混合不可移植,也不保证在使用后续发行版本的操作系统或 Fortran 时可以进行此操作。建议不要使用该函数,并且没有提供直接的接口。必须创建自己的 C 例程,才能使用 getfilep 返回的值。下面所示是一个 C 例程样例。

示例:Fortran 通过将 getfilep 传递给 C 函数来使用 getfile:

integer*4 c_read, getfilep, unitn / 5 / external getfilep write(*,’(a,$)’) ’What is the digit? ’ irtn = c_read( getfilep( unitn ), inbyte, 1 ) write(*,9) inbyte 9 format(’The digit read by C is ’, a )

实际使用 getfilep 的 C 函数样例:

1.4.26 ieee_flags、ieee_handler 和 sigfpe:IEEE 算术

这些子程序提供了在 Fortran 程序中充分利用 ANSI/IEEE 标准 754-1985 算术所需的模式和状态。它们与函数 ieee_flags(3M)、ieee_handler(3M) 和 sigfpe(3) 一一对应。

概括介绍如下:

表 1–5 IEEE 算术支持例程

有关如何有策略地使用这些函数的详细信息,请参见 Sun 的《数值计算指南》。

如果使用 sigfpe,必须在浮点状态寄存器中设置对应的陷阱-启用-掩码位。SPARC 体系结构手册中介绍了详细信息。libm 函数 ieee_handler 可为您设置这些陷阱-启用-掩码位。

modeexception 接受的字符关键字取决于 action 值。

表 1–6 ieee_flags( action , mode , in , out) 参数和操作

action = 'set'

设置 in 的用户处理异常;out 是处理程序例程的地址,或者是 floating point.h 中定义的 SIGFPE_DEFAULTSIGFPE_ABORT

SIGFPE_IGNORE
    INTEGER*4 ieeer
    character*1 mode, out, in
    ieeer = ieee_flags( ’set’, ’direction’, ’tozero’, out )

示例 2:将舍入方向清理为缺省方向(向最近的值舍入):

    character*18 out
    ieeer = ieee_flags( ’get’, ’exception’, ’overflow’, out )
    if (out .eq. ’overflow’ ) stop ’overflow’

上述代码将 out 设置为 overflow 并将 ieeer 设置为 25(该值视平台而定)。类似的编码可检测异常,例如 invalidinexact

示例 5:hand1.f,编写并使用信号处理程序:

address = sip.fault.address write (*,10) address 10 format(’Exception at hex address ’, z8 )

addressfunction hand 的声明更改为 INTEGER*8,以便示例 5 可以在 64 位 SPARC 环境中使用 (-m64)。

请参见《数值计算指南》。另请参见:floatingpoint(3)、signal(3)、sigfpe(3)、floatingpoint(3F)、ieee_flags(3M) 和 ieee_handler(3M)。

1.4.26.1 floatingpoint.h:Fortran IEEE 定义

头文件 floatingpoint.h 定义了根据 ANSI/IEEE 标准 754-1985 实现标准浮点所使用的常量和类型。

在 Fortran 95 源程序中包含该文件的方式如下所示:

如果要使用该 include 文件,需在进行 Fortran 编译之前进行预处理。如果引用该 include 文件的源文件的扩展名为 .F.F90.F95,则会自动预处理该文件。

IEEE 舍入模式:

如果声明了 INTEGER*8,在针对 64 位环境进行了编译且字符变量 a1 是非常大的字符串(大于 2 GB)时,index() 将返回 INTEGER*8 值。

1.4.27.2 rindex:字符串中最后一次出现某子串

该函数的调用方式如下所示:

demo% cat tindex.f
*                        123456789012345678901
       character s*24 / ’abcPDQxyz...abcPDQxyz’ /
       INTEGER*4 declen, index, first, last, len, lnblnk, rindex
       declen = len( s )
       first = index( s, ’abc’ )
       last = rindex( s, ’abc’ )
       lastnb = lnblnk( s )
       write(*,*) declen, lastnb
       write(*,*) first, last
demo% f95 tindex.f
demo% a.out
24 21     <- declen is 24  because intrinsic len() returns the declared length of  s

注 –

对于编译为要在 64 位环境中运行的程序,必须将 indexrindexlnblnk(以及它们的接收变量)声明为 INTEGER*8,以便处理非常大的字符串。

1.4.28 inmax:返回最大正整数

该函数的调用方式如下所示:

另请参见 libm_single(3F) 和 libm_double(3F)。另请参见第 3 章中介绍的 FORTRAN 77 非标准内函数 ephuge()

1.4.29 itime:当前时间

itime 将当前系统时间放入整型数组中:小时、分钟和秒。该子例程的调用方式如下所示:

status = kill( pid, signum ) if ( status .ne. 0 ) stop ’kill: error’ write(*,*) ’Sent signal ’, signum, ’ to process ’, pid

该函数将信号 signum 和整型信号编号发送到进程 pid。有效的信号编号列在 C include 文件 /usr/include/sys/signal.h 中。

另请参见:kill(2)、signal(3)、signal(3F)、fork(3F) 和 perror(3F)。

1.4.31 linksymlnk:创建指向现有文件的链接

link 创建指向现有文件的链接。symlink 创建指向现有文件的符号链接。

该函数的调用方式如下所示:

demo% cat tlink.f
        character*34 name1/’tlink.db.data.1’/, name2/’data1’/
        integer*4 link, status
        status = link( name1, name2 )
        if ( status .ne. 0 ) stop ’link: error’
demo% f95 tlink.f
demo% ls -l data1
data1 not found
demo% a.out
demo% ls -l data1
-rw-rw-r-- 2 generic 2 Aug 11 08:50 data1
demo%

1.4.31.2 symlnk::创建指向现有文件的符号链接

示例 2:symlnk:创建一个指向文件 tlink.db.data.1 的符号链接 data1

demo% cat tsymlnk.f
       character*34 name1/’tlink.db.data.1’/, name2/’data1’/
       INTEGER*4 status, symlnk
       status = symlnk( name1, name2 )
       if ( status .ne. 0 ) stop ’symlnk: error’
demo% f95 tsymlnk.f
demo% ls -l data1
data1 not found
demo% a.out
demo% ls -l data1
lrwxrwxrwx 1 generic 15 Aug 11 11:09 data1 -> tlink.db.data.1
demo%

另请参见:link(2)、symlink(2)、perror(3F) 和 unlink(3F)。

注意:路径名长度不能超过 <sys/param.h> 中定义的 MAXPATHLEN 值。

1.4.32 loc:返回对象的地址

该内函数的调用方式如下所示:

1.4.33 longshort:整型对象转换

longshort 处理 INTEGER*4INTEGER*2 之间的整型对象转换,在子程序调用列表中特别有用。

1.4.33.1 long:将短整型转换为长整型

该函数的调用方式如下所示:

ExpecLong 是用户程序调用的某子例程,要使用 long (INTEGER*4) 整型参数。而类似的子例程 ExpecShort 要使用 short (INTEGER*2) 整型参数。

如果在库例程调用中使用了常量且编译代码时使用了 -i2 选项,long 很有用。

在长型对象必须作为短整型传递的这类上下文环境中,short 很有用。将整数传递给幅度太大的短整型虽然不会导致出现错误,但会导致出现未预料的行为。

1.4.34 longjmpisetjmp:返回到由 isetjmp 设置的位置

isetjmplongjmp 设置位置;而 longjmp 返回到该位置。

1.4.34.1 isetjmp:为 longjmp 设置位置

该内函数的调用方式如下所示:

isetjmp
longjmp 例程用于处理在程序的低级例程中遇到的错误和中断。它们属于 f95 内函数。

如非必要,不应使用这些例程。它们受规范约束,且不可移植。有关错误和其他详细信息,请参见 setjmp(3V) 手册页。

isetjmpenv 中保存堆栈环境。它还会保存寄存器环境。

longjmp 会恢复上次调用 isetjmp 时保存的环境,并以继续执行这种方式返回值,就好像刚执行 isetjmp 调用返回 ival 值一样。

如果未调用 longjmp,从 isetjmp 返回的整型表达式 ival 为零,如果调用了 longjmp,则返回的 ival 不为零。

示例:使用 isetjmplongjmp 的代码片断:

1.4.35 mallocmalloc64reallocfree:分配/重新分配/解除分配内存

函数 malloc()malloc64()realloc() 分配内存块并返回块的起始地址。返回值可以用于设置 INTEGER 或 Cray 样式的 POINTER 变量。realloc() 根据新的大小重新分配现有内存块。free() 解除分配由 malloc()malloc64()realloc() 分配的内存块。


注 –

这些例程在 f95 中以内函数实现,而在 f77 中是外部函数。它们不应该出现在 Fortran 95 程序的类型声明和 EXTERNAL 语句中,除非您要使用自己的版本。只有 f95 中实现 realloc() 例程。

符合标准的 Fortran 95 程序应该将 ALLOCATEDEALLOCATE 语句用于 ALLOCATABLE 数组,以便执行动态内存管理,且不能直接调用 malloc/realloc/free

传统的 Fortran 77 程序可以使用 malloc()/malloc64() 为 Cray 样式的 POINTER 变量赋值,这些变量的数据表示形式与 INTEGER 变量的数据表示形式相同。在 f95 中实现了 Cray 样式的 POINTER 变量,以便能够从 Fortran 77 进行移植。

1.4.35.1 malloc malloc64:分配内存

malloc() 函数的调用方式如下所示:

这些函数会分配一片内存区域,并返回该区域起始位置的地址。(在 64 位环境中,返回的字节地址可能超出 INTEGER*4 数值范围-必须将接收变量声明为 INTEGER*8 以免内存地址被截断。)内存区域并未以任何方式初始化,因此,不应假设它已预设为什么内容,尤其是零!

示例:使用 malloc() 的代码片段:

realloc() 函数将 ptr 指向的内存块的大小更改为 n 字节,并返回指向(可能已移动的)新内存块的指针。内存块的内容保存不变,其大小为新内存块大小和旧内存块大小中较小者。

如果 ptr 为零,则 realloc() 的行为与 malloc() 的行为相同,其分配大小为 n 字节的新内存块。

如果 n 为零而 ptr 不为零,则指向的内存块可以进一步进行分配,且仅在终止应用程序后才返回给系统。

示例:使用 malloc()realloc() 以及 Cray 样式的 POINTER 变量:

if(p2space .eq. 0) STOP ’malloc: cannot allocate space’ p2space = realloc(p2space, 9*4*nsize) if(p2space .eq. 0) STOP ’realloc: cannot reallocate space’ CALL free(p2space)

请注意,只有 f95 中实现 realloc() 例程。

1.4.35.3 free:解除分配由 Malloc 分配的内存

该子例程的调用方式如下所示:

demo% cat mvb1.f
* mvb1.f -- From src, initial bit 0, move 3 bits to des, initial *           bit 3.
*    src    des
* 543210 543210 <- Bit numbers
* 000111 000001 <- Values before move
* 000111 111001 <- Values after move
       INTEGER*4 src, ini1, nbits, des, ini2
       data src, ini1, nbits, des, ini2
     1    / 7,    0,     3,   1,    3 /
       call mvbits ( src, ini1, nbits, des, ini2 )
       write (*,"(5o3)") src, ini1, nbits, des, ini2
demo% f95 mvb1.f
demo% a.out
  7  0  3 71  3
demo%

请注意以下事项:

位是从 0 到 31 依次编号,0 是最低有效位,31 是最高有效位。

fputc 向逻辑单元写入。

这些函数绕过正常的 Fortran I/O,将字符写入与 Fortran 逻辑单元关联的文件中。

请勿将正常的 Fortran 输出与相同单元中这些函数的输出混在一起。

请注意,要写入任何特殊的 \ 转义符(如换行符 '\n'),需要在编译时使用 FORTRAN 77 兼容选项 -f77=backslash

1.4.38.1 putc:向逻辑单元 6 写入

该函数的调用方式如下所示:

character char, s*11 / ’OK by fputc’ / INTEGER*4 fputc, status open( 1, file=’tfputc.data’) do i = 1, 11 char = s(i:i) status = fputc( 1, char ) end do status = fputc( 1, ’\n’ ) demo% f95 -f77=backslash tfputc.f demo% a.out demo% cat tfputc.data OK by fputc demo%

另请参见 putc(3S)、intro(2) 和 perror(3F)。

1.4.39 qsort 和 qsort64:对一维数组的元素排序

该子例程的调用方式如下所示:

可在 64 位环境中将 qsort64 用于大于 2 GB 的数组。请确保将数组长度 len8 和元素大小 isize8 指定为 INTEGER*8 数据。可使用 Fortran 95 样式的常量显式指定 INTEGER*8 常量。

compar(arg1, arg2) 参数是 array 的元素,它返回以下值:

INTEGER*4 array(10)/5,1,9,0,8,7,3,4,6,2/,len/10/, 1 isize/4/ call qsort( array, len, isize, compar ) write(*,’(10i3)’) array integer*2 function compar( a, b ) INTEGER*4 a, b if ( a .lt. b ) compar = -1 if ( a .eq. b ) compar = 0 if ( a .gt. b ) compar = 1 return demo% f95 tqsort.f demo% a.out 0 1 2 3 4 5 6 7 8 9

1.4.40 ran:生成介于 0 和 1 之间的随机数

反复调用 ran 可生成一个分布均匀的随机数序列。请参见 lcrans(3m)。

demo% a.out 0.222058 0.299851 0.390777 0.607055 0.653188 0.060174 0.149466 0.444353 0.002982 0.976519 demo%

请注意以下事项:

该范围包括 0.0,但不包括 1.0。

demo% cat trename.f
       INTEGER*4 rename, status
       character*18 from/’trename.old’/, to/’trename.new’/
       status = rename( from, to )
       if ( status .ne. 0 ) stop ’rename: error’
demo% f95 trename.f
demo% ls trename*
trename.f trename.old
demo% a.out
demo% ls trename*
trename.f trename.new
demo%

另请参见 rename(2) 和 perror(3F)。

注意:路径名长度不能超过 <sys/param.h> 中定义的 MAXPATHLEN 值。

1.4.43 secnds:获取系统时间(秒)减去参数值后所得值

elapsed = secnds( t1 ) write ( *, 1 ) elapsed 1 format ( ’ 10000 arcsines: ’, f12.6, ’ sec’ ) demo% f95 sec1.f demo% a.out 10000 arcsines: 0.009064 sec demo%
SECNDS 的返回值精确到 0.01 秒。

1.4.44 set_io_err_handlerget_io_err_handler:设置和获取 I/O 错误处理程序

set_io_err_handler() 声明每当在指定的输入逻辑单元中检测到错误时要调用的用户自定义例程。 get_io_err_handler() 返回当前声明的错误处理例程的地址。

这些例程为模块子例程,只有当调用例程中有 USE SUN_IO_HANDLERS 时,才能访问这些例程。 SET_IO_ERR_HANDLER 设置用户提供的子例程 subr_name,它在出现输入错误时用作逻辑单元 iu 的 I/O 错误处理程序。对于格式化的文件,iu 必须是连接的 Fortran 逻辑单元。如果有错误,istat 将设置为非零值,否则设置为零。

例如,如果在打开逻辑单元 iu 之前调用 SET_IO_ERR_HANDLERistat 将设置为 1001(“非法单元”)。如果 subr_name 为 NULL,用户错误处理将关闭,且程序恢复到缺省的 Fortran 错误处理。

可使用 GET_IO_ERR_HANDLER 获取当前用作相应逻辑单元的错误处理程序的函数的地址。例如,先调用 GET_IO_ERR_HANDLER 保存当前 I/O,然后再切换到另一个处理程序例程。以后可以通过保存的值恢复错误处理程序。

subr_name 是用户提供的例程的名称,用于处理逻辑单元 iu 上的 I/O 错误。运行时 I/O 库将所有相关信息传递给 subr_name,以使该例程可以诊断问题并在可能的情况下修复错误,然后继续运行。

用户提供的错误处理程序例程的接口如下所示:

1.4.44.1 局限性

I/O 处理程序只能用另一个字符替换一次。它不能用多个字符替换一个字符。

错误恢复算法只能修复当前读取的错误字符,而不能修复在其他上下文环境中已经解释为有效字符的错误字符。例如,在进行列表控制的读取时,如果输入是 "1.234509.8765",而正确的输入应该是 "1.2345 9.8765",I/O 库将在第二个阶段遇到错误,因为它不是有效的数字。但此时不能回去将 '0' 更改为空白。

当前,这种错误处理功能不适用于名称列表控制的输入。在进行名称列表控制的输入时,如果出现错误,不会调用指定的 I/O 错误处理程序。

只能为外部文件而不能为内部文件设置 I/O 错误处理程序,这是因为没有与内部文件关联的逻辑单元。

只能针对语法错误而不能针对系统错误或语义错误(例如溢出的输入值)调用 I/O 错误处理程序。

如果用户提供的 I/O 错误处理程序不断向 I/O 库提供错误的字符,从而导致反复调用用户提供的 I/O 错误处理程序,则可能出现无限循环。如果在同一个文件位置反复出现错误,错误处理程序应该自行终止运行。一种解决方法就是通过将 CORR_ACTION 设置为 0 来采用缺省的错误路径。这样,I/O 库将继续运行并进行正常的错误处理。

1.4.45 sh:快速执行 sh 命令

该函数的调用方式如下所示:

当前进程将等到命令终止。

函数 sh(3f) 和 system(3f) 将参数字符串传递给 shell 用于执行。它们将参数字符串从 Fortran 字符值转换为 C 字符串值,并将其传递给 C 例程 system(3c)。例程 sh(3f) 和 system(3f) 的不同之处在于,system 在调用 C 例程系统前将刷新 Fortran I/O 缓冲区,而 sh 则不会刷新缓冲区。由于刷新缓冲区需要很长时间,因此,如果 Fortran 输出与调用结果无关,那么优先使用例程 system,而非例程 sh

sh() 函数不能安全地用于多线程程序。请勿从多线程或并行程序中调用该函数。

另请参见:execve(2)、wait(2) 和 system(3c)。

注意:string 不能超过 1,024 个字符。

1.4.46 signal:按信号更改操作

该函数的调用方式如下所示:

如果调用 proc,则将信号编号作为整数参数传递给它。

如果进程引发信号,缺省的操作通常是清理并中止。信号处理例程提供了捕捉特定异常或中断以便进行特殊处理的功能。

返回值可以用于后续 signal 调用中,以便恢复以前的操作定义。

即使没有错误,您也有可能会获得负返回值。事实上,如果将有效的信号编号传递给 signal(),获得的返回值小于 -1,这是正常的。

floatingpoint.h 定义 procSIGFPE_DEFAULTSIGFPE_IGNORESIGFPE_ABORT。请参见
1.4.26.1 floatingpoint.h:Fortran IEEE 定义

在 64 位环境中,必须将 signal 和接收其输出的变量声明为 INTEGER*8,以免可能返回的地址被截断。

另请参见 kill(1)、signal(3) 和 kill(3F) 以及《数值计算指南》。

1.4.47 sleep:暂停执行一段时间

该子例程的调用方式如下所示:

       character name*18 /’MyFile’/
       INTEGER*4 ierr, stat, lunit/1/, statb(13)
       open( unit=lunit, file=name )
       ierr = stat ( name, statb )
       if ( ierr .ne. 0 ) stop ’stat: error’
       write(*,*)’UID of owner = ’,statb(5),’,
     1   blocks = ’,statb(13)

1.4.48.2 fstat:按逻辑单元获取文件状态

该函数的调用方式如下所示:

       character name*18 /’MyFile’/
       INTEGER*4 fstat, lunit/1/, statb(13)
       open( unit=lunit, file=name )
       ierr = fstat ( lunit, statb )
       if ( ierr .ne. 0 ) stop ’fstat: error’
       write(*,*)’UID of owner = ’,statb(5),’,
     1      blocks = ’,statb(13)

1.4.48.3 lstat:按文件名获取文件状态

该函数的调用方式如下所示:

       character name*18 /’MyFile’/
       INTEGER*4 lstat, lunit/1/, statb(13)
       open( unit=lunit, file=name )
       ierr = lstat ( name, statb )
       if ( ierr .ne. 0 ) stop ’lstat: error’
       write(*,*)’UID of owner = ’,statb(5),’,
     1   blocks = ’,statb(13)

1.4.48.4 文件状态数组的详细信息

INTEGER*4 数组 statb 中返回的信息的含义在 stat(2) 的 stat 结构中进行了介绍。

备用值不包括在内。顺序如下表所示:

另请参见 stat(2)、access(3F)、perror(3F) 和 time(3F)。

注意:路径名长度不能超过 <sys/param.h> 中定义的 MAXPATHLEN 值。

1.4.49 stat64lstat64fstat64:获取文件状态

它们是 statlstatfstat 的 64 位“长文件”版本。除了由 13 个元素组成的数组 statb 必须声明为 INTEGER*8 之外,这些例程与非 64 位例程相同。

1.4.50 system:执行系统命令

该函数的调用方式如下所示: INTEGER*4 status, system status = system( string ) if ( status .ne. 0 ) stop ’system: error’

函数 systemstring 作为输入传递给 shell,就好像以命令方式键入该字符串。注意:string 不能超过 1,024 个字符。

如果 system 可以找到环境变量 SHELL,则 system 会将 SHELL 值用作命令解释程序 (shell);否则使用 sh(1)。

当前进程将等到命令终止。

一直以来,对 cc 开发时进行了不同的假设:

如果 cc 调用 system,则 shell 始终为 Bourne shell。

函数 sh(3f) 和 system(3f) 将参数字符串传递给 shell 用于执行。它们将参数字符串从 Fortran 字符值转换为 C 字符串值,并将其传递给 C 例程 system(3c)。例程 sh(3f) 和 system(3f) 的不同之处在于,system 在调用 C 例程 system 前将刷新 Fortran I/O 缓冲区,而 sh 则不会刷新缓冲区。由于刷新缓冲区需要很长时间,因此,如果 Fortran 输出与调用结果无关,那么优先使用例程 system,而非例程 sh

另请参见:execve(2)、wait(2) 和 system(3)。

system() 函数不能安全地用于多线程程序。请勿从多线程或并行程序中调用该函数。

1.4.51 timectimeltimegmtime:获取系统时间

这些例程具有以下函数:

C 库例程 ctime(3C) 对这些值进行了定义,它解释了系统可能会返回值大于 59 的秒数的原因。另请参见:idate(3F) 和 fdate(3F)。

1.4.51.5 ctime64gmtime64ltime64:64 位环境的系统时间例程

这些是例程 ctimegmtimeltime 的对应版本,用于在 64 位环境中进行移植。除了输入变量 stime 必须是 INTEGER*8 之外,它们与这些例程相同。

在 32 位环境中使用且 stimeINTEGER*8 时,如果 stime 值超出 INTEGER*4 范围,ctime64 的返回值全是星号,而 gmtimeltime 在 tarray 数组中填入 -1。

1.4.52 ttynamisatty:获取终端端口的名称

ttynamisatty 处理终端端口的名称。

1.4.52.1 ttynam:获取终端端口的名称

函数 ttynam 返回与逻辑单元 lunit 关联的终端设备的空白填充路径名。

该函数的调用方式如下所示:

terminal = isatty( lunit ) name = ttynam( lunit ) write(*,*) ’terminal = ’, terminal, ’, name = "’, name, ’"’

另请参见:unlink(2)、link(3F) 和 perror(3F)。注意:路径名长度不能超过 <sys/param.h> 中定义的 MAXPATHLEN 值。

1.4.54 wait:等待进程终止

该函数的调用方式如下:

另请参见:wait(2)、signal(3F)、kill(3F) 和 perror(3F)。