簡體   English   中英

C低級讀寫功能等效於64位嗎?

[英]C low level read write functions 64-bit equivalent?

我有一個使用水平低一些代碼I / O readwrite系統調用,如C語言編程的書Kernighan和里奇的170頁上介紹。 功能原型是這個

int n_read = read  ( int fd, char *buf, int n )
int n_read = write ( int fd, char *buf, int n )

現在,一個較大的基於fortran的程序調用了使用這些readwrite的兩個.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 *streamfread()

我的要求是能夠傳遞8個字節的長整數,以允許最大100到500 GB的值或具有12位數字的整數,所有這些都是nbyte的值

難道我得到什么或者目前使用輸給了readwrite標識為“系統呼叫”? 這是什么意思?

編輯:您不能,至少不能在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM