
Ubuntu日本語フォーラム
ログインしていません。
ubuntuにてLinuxプログラミングを学習中の初心者です。
ソフトバンククリエイティブの「Linuxプログラミング 例題から学ぶUNIXプログラミング環境のすべて」という本を見て、
下記の低水準ファイルアクセス(P119)のプログラムをつくりコンパイルをしたところエラーが出てしまいました。
●プログラム
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
char c;
int in, out;
in = open("file.in", O_RDONLY);
out = open("file.out", O_WRONLY|O_CREATE, S_IRUSR|S_IWUSR);
while(read(in, &c,1) ==1 )
write(out, &c, 1);
return(0);
}
●エラー
ryuichi@ubuntu-virtualbox:~$ gcc -o copy_system copy_system.c
copy_system.c: In function ‘main’:
copy_system.c:12: error: ‘O_CREATE’ undeclared (first use in this function)
copy_system.c:12: error: (Each undeclared identifier is reported only once
copy_system.c:12: error: for each function it appears in.)
インクルードファイルを/usr/include/fcntl.h →/usr/include/bits/fcntl.hとたどると、
#define O_CREAT 0100 /* not fcntl */ という記述がありました。
O_CREATEは/usr/include/bits/fcntl.hで定義されているのですが、
/* not fcntl */の記述の意味がわかりません。
良きアドバイスをいただけないでしょうか?
オフライン
自分で答えに辿り着いた方がいいと思うので、直接的な回答は載せません。
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fcntl.2.html
を見ながら、
/usr/include/bits/fcntl.h
を良く読んでみると答えが書いてあります。
# 「こんな理解であってる?」という形で何か書いてもらった場合には回答します;)
オフライン
/* not fcntl */の方はおいといて、
> O_CREATEは/usr/include/bits/fcntl.hで定義されているのですが、
定義されているのはO_CREAT(Eがつかない)でO_CREATEではないです。
(こういうのは自分ではなかなか気づきにくいものなので)
オフライン
>znz様
ご指摘ありがとうございます。コンパイルとおりました。
ケアレスミスとは。。。エラーメッセージをよく読んで基本的な部分を確認すべきでした。
お恥ずかしい。
Linuxは奥が深いので、ついついエラーなども深く考えがちです。気をつけます。
>hito様
アドバイスありがとうございます。
今回は私のケアレスミスでしたが、hitoさんのアドバイスは勉強になります。
#define O_CREAT 0100 /* not fcntl */
の意味は、「fcntl()において状態フラグを変更する際、ファイルのアクセスモード (O_RDONLY, O_WRONLY, O_RDWR) とファイル作成フラグ (すなわち O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC) に関するビットは無視される。」
ということと関連があるのでしょうか?
ファイルのアクセスモード (O_RDONLY, O_WRONLY, O_RDWR)のシンボルには/* not fcntl */の記述が無い点で引っかかっています。
最後の編集者: Rick555 (2008-03-26 10:15:25)
オフライン
open()によるファイル作成時のflagにファイル作成フラグ (file creation flag) と
ファイル状態フラグ (file status flag) の2種があり、fcntl()により変更できるのは、
ファイル状態フラグ のみ(すなわち O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC 以外のフラグ)
ということで、
#define O_CREAT 0100 /* not fcntl */
~
という記述になっていると理解しました。
上記の理解で正しいでしょうか?
オフライン
Rick555 による投稿:
open()によるファイル作成時のflagにファイル作成フラグ (file creation flag) と
ファイル状態フラグ (file status flag) の2種があり、fcntl()により変更できるのは、
ファイル状態フラグ のみ(すなわち O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC 以外のフラグ)
ということで、
#define O_CREAT 0100 /* not fcntl */
~
という記述になっていると理解しました。
上記の理解で正しいでしょうか?
ぴんぽーん。(←それだけですごめんなさい。何か気の利いたコメントを書く余力がありませんorz)
オフライン