C低级读写函数64位等效?
我有一些代码使用低级I/oC低级读写函数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,函数名后面有下划线,
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函数将读取/写入指定的全部字节数,否则将失败,但POSIXread()
和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