[英]C low level read write functions 64-bit equivalent?
我有一個使用水平低一些代碼I / O read
和write
系統調用,如C語言編程的書Kernighan和里奇的170頁上介紹。 功能原型是這個
int n_read = read ( int fd, char *buf, int n )
int n_read = write ( int fd, char *buf, int n )
現在,一個較大的基於fortran的程序調用了使用這些read
和write
的兩個.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值可以正常工作。 我需要讀取2 GB以上的數據,因此我需要nbyte是一個長整數 ,在fortran中為INTEGER * 8 。
是否有等效的read64和write64,如unistd.h和features.h提供的lseek64?
重新編碼的最佳方法是什么? 我應該使用fread和fwrite嗎? 是int fd
從低電平write
相同FILE *stream
從fread()
我的要求是能夠傳遞8個字節的長整數,以允許最大100到500 GB的值或具有12位數字的整數,所有這些都是nbyte的值
難道我得到什么或者目前使用輸給了read
和write
標識為“系統呼叫”? 這是什么意思?
編輯:您不能,至少不能在Linux上。 read
將永遠不會傳輸超過32位整數可以容納的內容。
從Linux的聯機手冊中read
:
在Linux上,read()(和類似的系統調用)將最多傳輸0x7ffff000(2,147,479,552)字節,並返回實際傳輸的字節數。 (在32位和64位系統上都是如此。)
這不是POSIX的約束,它是POSIX允許的,但是最后它的實現定義了read
行為。 正如安德魯·漢勒(Andrew Hanle)報告的那樣,在Solaris上讀取32GB文件效果很好。 在這種情況下,我的舊答案仍然有效。
舊答案:
read
可以與64位文件配合使用。 它在<unistd.h>
定義如下:-
ssize_t read(int fd, void *buf, size_t count);
您必須調整例程以使用size_t
而不是int
,才能正確支持大文件。
在對大文件使用read
之前,應檢查SSIZE_MAX
(為count
支持的最大值),如果文件較小(或拆分為較小的塊),則中止。 SSIZE_MAX
是實現定義的值。
正如@Leandros所觀察到的,符合POSIX的read()
和write()
接受size_t
類型的字節計數,並返回ssize_t
類型的字節計數。 這些可能是實際上適用於您的定義,因為C標准未指定read()
和write()
函數。 但是,這是一個區別,沒有太大區別,因為size_t
不需要比int
寬-實際上,它可以更窄。
無論如何,您有更大的問題。 Fortran代碼似乎假設它正在調用的C函數將讀取/寫入指定的完整字節數,否則將失敗,但是POSIX read()
和write()
不能保證在它們成功時就這樣做。 確實,前幾天在這里存在一個問題,該問題取決於以下事實:即使在具有64位元的64位系統上,這些函數一次傳輸的字節數也不會超過有符號的32位整數所表示的字節數。 [s]size_t
位。
您可以通過實現read_()
和write_()
函數循環執行,對基礎read()
或write()
函數進行連續調用,直到將指定字節的全部數量傳輸或發生錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.