お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2008-03-25 18:44:37

Rick555
新しいメンバ
登録日: 2008-03-25

システムコールプログラミングについて

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);   

}


●エラー
[email protected]:~$ 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 */の記述の意味がわかりません。

良きアドバイスをいただけないでしょうか?

オフライン

 

#2 2008-03-25 19:36:43

hito
管理者
登録日: 2007-03-18

Re: システムコールプログラミングについて

自分で答えに辿り着いた方がいいと思うので、直接的な回答は載せません。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fcntl.2.html
を見ながら、
/usr/include/bits/fcntl.h
を良く読んでみると答えが書いてあります。

# 「こんな理解であってる?」という形で何か書いてもらった場合には回答します;)

オフライン

 

#3 2008-03-25 20:01:28

znz
メンバ
登録日: 2007-06-23

Re: システムコールプログラミングについて

/* not fcntl */の方はおいといて、

>  O_CREATEは/usr/include/bits/fcntl.hで定義されているのですが、

定義されているのはO_CREAT(Eがつかない)でO_CREATEではないです。
(こういうのは自分ではなかなか気づきにくいものなので)

オフライン

 

#4 2008-03-25 21:01:49

Rick555
新しいメンバ
登録日: 2008-03-25

Re: システムコールプログラミングについて

>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)

オフライン

 

#5 2008-03-25 21:18:20

Rick555
新しいメンバ
登録日: 2008-03-25

Re: システムコールプログラミングについて

open()によるファイル作成時のflagにファイル作成フラグ (file creation flag) と
ファイル状態フラグ (file status flag) の2種があり、fcntl()により変更できるのは、
ファイル状態フラグ のみ(すなわち O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC 以外のフラグ)
ということで、
 #define O_CREAT           0100    /* not fcntl */ 
 ~
という記述になっていると理解しました。
上記の理解で正しいでしょうか?

オフライン

 

#6 2008-03-26 14:57:47

hito
管理者
登録日: 2007-03-18

Re: システムコールプログラミングについて

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)

オフライン

 

#7 2008-03-27 10:12:16

Rick555
新しいメンバ
登録日: 2008-03-25

Re: システムコールプログラミングについて

あってて良かったです。
良きアドバイスありがとうございました。(^^)

オフライン

 

Board footer

Powered by FluxBB