• ベストアンサー

O_CREAT、O_TRUNC、O_WRONLYはどうして512、1024、1になる?何進数表示?

Win2k+cygwinの環境です。 #include <unistd.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> int main(void){ int c,i,t,w; c=O_CREAT,t=O_TRUNC,w=O_WRONLY; i=(O_WRONLY | O_CREAT | O_TRUNC); printf("c=%d,t=%d,w=%d,i=%d\n",c,t,w,i); return 0; } を実行すると $ ./test c=512,t=1024,w=1,i=1537 となりました。 /cygwin/usr/include/bits/fcntl.hには #define O_ACCMODE 0003 #define O_RDONLY 00 #define O_WRONLY 01 #define O_RDWR 02 #define O_CREAT 0100 /* not fcntl */ #define O_EXCL 0200 /* not fcntl */ #define O_NOCTTY 0400 /* not fcntl */ #define O_TRUNC 01000 /* not fcntl */ #define O_APPEND 02000 #define O_NONBLOCK 04000 #define O_NDELAY O_NONBLOCK #define O_SYNC 010000 #define O_FSYNC O_SYNC #define O_ASYNC 020000 #ifdef __USE_GNU # define O_DIRECT 040000 /* Direct disk access. */ # define O_DIRECTORY 0200000 /* Must be a directory. */ # define O_NOFOLLOW 0400000 /* Do not follow links. */ となっていまして、どうして c=512,t=1024,w=1,i=1537 になるのか分かりません。8進数表になっているのかと推測して #define O_CREAT 0100 よりこれは Ox0100 (8進数表示での0100)の意味なので10進数表示に変換してみましたら 64 となって辻褄が合いません。 #define O_TRUNC 01000 に於いても Ox01000→512 #define O_WRONLY 01 に於いては Ox01→1 でこれだけは実行結果と一致しています。 どうして c=512,t=1024,w=1,i=1537 となるのでしょうか?

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

  • ベストアンサー
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

>/cygwin/usr/include/bits/fcntl.hには 手元のcygwinにはinclude/bitsは存在しませんが、何か特殊なものインストールされているんでしょうか。 おそらくそのファイルは実際には使用されていないと思われます。 こちらでは /Cygwin/usr/include/fcntl.h、およびそこからincludeしている/Cygwin/usr/include/sys/fcntl.hが使われていて、 例えば、 #define O_CREAT _FCREAT #define _FCREAT 0x0200 /* open with file create */ となっていますので、実行結果と一致します。 ちなみに、 find /usr/include -name fcntl.h としてみると、 /usr/include/mingw/fcntl.h というのがあって、これまた違うdefineになっています。 いずれにしろ標準で使われるのは /usr/includeです。 もし、bitsの定義を使用したいなら コンパイル時にincludeパスを指定する必要がありますし、もしかすると標準のincludeを使わない指定が必要かも知れません。 クロスコンパイルでもしないと使わないような気がしますが。

KaoriM
質問者

お礼

$ cd /usr/include $ ctags -R --exclude=mingw としてtagsを作り直してタグジャンプしたら上手くいきました。

KaoriM
質問者

補足

こんにちは。有難うございます。 > >/cygwin/usr/include/bits/fcntl.hには > 手元のcygwinにはinclude/bitsは存在しませんが、何か特殊なものインストールされ > ているんでしょうか。 もう2年くらい経つので知らないうちにいじってしまったのかもしれません。 /usr/include/sys/fcntl.h を直接 $ vim.exe c:/cygwin/usr/include/sys/fcntl.h として開いて、O_CREATを探してタグジャンプしてみましたら0x0200に辿り着きました。 このヘッダより O_WRONLYは1、O_CREATは0x0200、O_TRUNCは0x0400 ですね。 10進数表示に変換すると 1は10進数でも1 0x0200→512、 0x0400→1024 で $ ./test c=512,t=1024,w=1,i=1537 に辻褄がありますね。 一応念のため、先月にOS自体を再クリーンインストールしてCygwinも最新のものをインストールしたWin2kのマシンでも試してみました(下記)。 > ちなみに、 > find /usr/include -name fcntl.h > としてみると、 > /usr/include/mingw/fcntl.h > というのがあって、これまた違うdefineになっています。 -mno-cygwinオプションとか非使用なのに 何故か他のヘッダにタグジャンプしてしまいます。 #include <fcntl.h> ↓ #include </usr/include/fcntl.h> としてもO_CREATからタグジャンプしたら /usr/include/mingw/fcntl.hに飛びまして、 #define _O_CREAT 0x0100 に行き着きました。 findコマンドでその他のfcntl.hを探してみましたら /usr/include/fcntl.h /usr/include/mingw/fcntl.h /usr/include/mingw/sys/fcntl.h /usr/include/sys/fcntl.h がヒットしました。 terra5さんの環境では /Cygwin/usr/include/fcntl.h にタグジャンプされるんですよね。 するとctagsの問題みたいです。。。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1の方のとおりだと思いますが、 それとは、別のところでツッコミ 0で始まる定数は8進数として解釈されます。 0xで始まる定数は16進数として解釈されます。

KaoriM
質問者

お礼

> #1の方のとおりだと思いますが、 > それとは、別のところでツッコミ > 0で始まる定数は8進数として解釈されます。 > 0xで始まる定数は16進数として解釈されます。 有難うございます。 憶えて置きます。

関連するQ&A

専門家に質問してみよう