C低级读写函数64位等效?

C低级读写函数64位等效?,c,C,我有一些代码使用低级I/oread和write系统调用,如C编程语言书Kernighan和Ritchie第170页所述。 功能原型如下所示 int n_read = read ( int fd, char *buf, int n ) int n_read = write ( int fd, char *buf, int n ) 现在,一个更大的基于fortran的程序调用使用这些读取和写入的两个.c文件来读取和写入大量数据 C代码就是这样,没有任何类型的#include,函数名后面有下划线,

我有一些代码使用低级I/o
read
write
系统调用,如C编程语言书Kernighan和Ritchie第170页所述。 功能原型如下所示

int n_read = read  ( int fd, char *buf, int n )
int n_read = write ( int fd, char *buf, int n )
现在,一个更大的基于fortran的程序调用使用这些
读取
写入
的两个.c文件来读取和写入大量数据

C代码就是这样,没有任何类型的
#include
,函数名后面有下划线,并通过引用传递:

int read_ ( int *descriptor, char *buffer, int *nbyte )
{
   return ( read( *descriptor, buffer, *nbyte ) );
}

int write_ ( int *descriptor, char *buffer, int *nbyte )
{
   return ( write( *descriptor, buffer, *nbyte ) );
}
更大的基于fortran的程序将执行类似的操作

INTEGER nbyte
COMPLEX*16 matrix(*)
INTEGER READ, WRITE
EXTERNAL READ, WRITE

status = READ( fd, matrix, nbyte )
if ( status .eq. -1 ) then
   CALL ERROR('C call read failure')
   stop
endif
正如您可能已经猜到的那样,对于小于2^31的nbyte值,这种方法非常有效。我需要读取超过2GB的数据,因此我需要nbyte成为fortran中的长整数和整数*8

是否有与unistd.h和features.h提供的lseek64相同的read64和write64

重新编码的最佳方法是什么? 我应该使用fread和fwrite吗? 来自低级
write
int fd
是否与来自
fread()
文件*流相同

我的要求是能够传递一个8字节的长整数,以允许值高达100到500 GB,或者传递一个12位的整数,这都是用于值nbyte


当前使用
read
write
(识别为“系统调用”)是否有任何收获或损失?这意味着什么?

编辑:您不能,至少在Linux上不能<代码>读取
的传输量永远不会超过32位整数所能容纳的量

上的Linux手册页中读取

在Linux上,read()(和类似的系统调用)最多只能传输 0x7ffff000(2147479552)字节,返回字节数 实际上已经转移了。(32位和64位都是如此 系统。)

这不是POSIX的约束,它是POSIX允许的,但最终它的实现定义了
read
的行为。据报道,在Solaris上读取32GB的文件效果很好。在这种情况下,我的旧答案仍然有效

旧答案:

read
可以很好地处理64位文件。它在
中定义如下:-

ssize_t read(int fd, void *buf, size_t count);
您必须调整例程以使用
size\u t
而不是
int
,以正确支持大文件


在对大文件使用
read
之前,应先检查
SSIZE_MAX
(count支持的最大值),如果文件太小(或拆分为较小的块),则应中止
SSIZE_MAX
是一个实现定义的值。

正如@Leandros所观察到的,符合POSIX的
read()
write()
实现接受
size_t
类型的字节计数,并返回
SSIZE_t
类型的字节计数。这些可能是实际适用于您的定义,因为C标准没有指定
read()
write()
函数。然而,这是一个没有太大区别的区别,因为
size\u t
不需要比
int
宽——事实上,它可以更窄

无论如何,你有一个更大的问题。Fortran代码似乎假定它所调用的C函数将读取/写入指定的全部字节数,否则将失败,但POSIX
read()
write()
不能保证在成功时这样做。事实上,前几天这里出现了一个问题,这个问题取决于这样一个事实,即这些函数一次传输的字节数不超过有符号的32位整数所能表示的字节数,即使在64位大小的64位系统上也是如此


通过实现循环的
read()
write()
函数,执行对底层
read()
write()
函数的连续调用,可以一举两得地杀死这两只鸟,直到指定字节的完整数量被传输或出现错误。

在所有字节都被读取之前,以小数据块进行连续读取如何?除非您出于历史原因好奇,否则您现在不应该学习K&R C。现在那里有很多东西都不受欢迎,过时或是完全错误。例如,如果您对
read()
函数使用RTFM,您可能会找到Leandros给您的声明,并可能自己解决了您的问题。WeatherVane说,这充其量只是一个丑陋的解决方法。如果Fortran端无法与C代码接口,仍然需要记住。有关库函数的最新信息,请打开终端窗口,并使用
man
命令。例如,
man 2 read
告诉您有关
read
功能的所有信息。数字2表示手册中的章节。第1节主要介绍shell命令。第2节和第3节有C库函数。您如何知道
size\u t
足够大,可以处理64位数字?它允许有一个最大的可表示值,小到65534。@JohnBollinger他使用的是posixapi,而不是stdio。POSIX难道不要求
size\u t
足够大才能达到最大文件大小吗?@Barmar、POSIX和C都允许
size\u MAX
小到65534。看啊,我明白了。POSIX具有文件偏移量的
off\u t
,但是单个
read()
可能仍然被限制为
size\u t
@JohnBollinger如果您不能假设
size\u t
在64位系统上是64位的,那么
size\u t
是相当无用的,不是?(也许这就是你的观点。)在任何情况下,OP都可以在运行时检查
sizeof(size\u t)
,如果不是8,则中止。你必须这样做<代码>读取不支持读取超过0x7ffff000