OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

Win SFU (Services for Unix)環境下で2GB超ファイルの末尾を取得したい

  • すぐに回答を!
  • 質問No.647073
  • 閲覧数494
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 33% (3/9)

業務上、2GB超のファイルを操作する必要があり、Win2Kを使って、その下でUnixコマンドを使用できるよう、SFU (Services for Unix) を使用しています。
そのシステム上で、2GB超のファイルの末尾nバイトを取得する処理が必要になるのですが、tail -c や、dd 等を使用しても、ファイルの末尾を取得するのではなく、変な動きをしてしまいます。
何か別の方法をご存知でしたら教えて頂けますでしょうか。

<前提>
1. ファイルの大きさは、都度変わりうる(min: 0, max: 数十GB)
2. NTFS上に、2GB超のファイルを既に書けていて、wc などの、単純にファイルを先頭から操作するコマンドは機能している。
3. SFUのkshを使用している。(他処理と連携したシステムの一部として作りたいので、パイプ・リダイレクト等で繋いで手操作はゼロにしたい)

<既に試してダメだった方法>
tail -c n ... 先頭からファイルを参照しているような動きをする
tail +c ファイルサイズ-n ... 'Could not seek to byte -2139091255n file 'とエラーになる
dd ... seek=n ... tail + と同様に、seekが失敗したとのエラー表示をし、エラーになる
Perlでseekシステムコール システムコールが失敗する。

よろしくお願いします。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル14

ベストアンサー率 63% (1021/1612)

SFUで扱えるファイルサイズの最大を確認してみて下さい。

多くのUNIX/Linuxはfopen()を利用してますが、
ファイル内のオフセットをlong(int)で持っているので、これだと最大オフセットが
2^31=2Gで、それを超えるサイズのファイルはアクセスできません。

Solarisなどでは64bitモードがあるのでfopen64()で大規模ファイルにアクセス
できます。
fopen64()が使えるなら、C言語などで簡単なプログラムを組めば良いです。
お礼コメント
stosh

お礼率 33% (3/9)

返答が遅くなりましたが、質問への回答ありがとうございます。

結局のところ、Cでファイルの末尾を取得するためのコーディングに入ることになりましたので、参考にさせていただきます。
投稿日時 - 2003-09-21 16:46:14
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.2
レベル14

ベストアンサー率 63% (1021/1612)

最近のLinuxではtail、wcコマンドなどは内部で以下のシステムコール を実行しています。 open("/var/log/messages", O_RDONLY|O_LARGEFILE) = 3 O_LARGEFILEの意味を確認すると、 # man 2 open OPEN(2)    System calls     OPEN(2) NAME   ...続きを読む
最近のLinuxではtail、wcコマンドなどは内部で以下のシステムコール
を実行しています。

open("/var/log/messages", O_RDONLY|O_LARGEFILE) = 3

O_LARGEFILEの意味を確認すると、

# man 2 open

OPEN(2)    System calls     OPEN(2)

NAME
 open, creat - open and possibly create a file or device

SYNOPSIS
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>

 int open(const char *pathname, int flags);
 int open(const char *pathname, int flags, mode_t mode);
 int creat(const char *pathname, mode_t mode);

DESCRIPTION

 O_LARGEFILE
  On 32-bit systems that support the Large Files System, allow
  files whose sizes cannot be represented in 31 bits to be opened.


O_LARGEFILEを指定すると
2^32=4GB
のサポートとなり、指定しない場合は
2^31=2GB
となります。


このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ