掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24277

Linuxにおけるopen()の実装方法について
投稿者---zero(2005/11/20 23:31:43)


開発環境はLinuxです。

ふと疑問に思ったのですが、Linuxにはシステムコールとしてopen()がありますが、open(2)を見ると、以下のふたつが載っています。

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

同じ関数名でしかも引数の数が違うものをどの様に実装しているのでしょうか?

ご教授のほどよろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:Linuxにおけるopen()の実装方法について 24280 かずま 2005/11/21 02:50:29
<子記事> Re:Linuxにおけるopen()の実装方法について 24281 επιστημη 2005/11/21 06:23:43


No.24280

Re:Linuxにおけるopen()の実装方法について
投稿者---かずま(2005/11/21 02:50:29)


次のプログラムは参考になりますか?
#include <stdio.h>
#include <stdarg.h>
#include <fcntl.h>

int fake_open(const char *name, int flag, ...)
{
    if (flag | O_CREAT) {
        int mode;
        va_list ap;
        va_start(ap, flag);
        mode = va_arg(ap, int);
        printf("name=%s, flag=%#x, mode=%#o\n", name, flag, mode);
        va_end(ap);
    } else
        printf("name=%s, flag=%#x\n");
    return 0;
}

int main(void)
{
    fake_open("file1", O_RDONLY);
    fake_open("file2", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    return 0;
}



この投稿にコメントする

削除パスワード

No.24290

Re:サンプルプログラムの疑問
投稿者---zero(2005/11/21 20:42:40)


if (flag | O_CREAT) { <=================================
int mode;
va_list ap;
va_start(ap, flag);
mode = va_arg(ap, int);
printf("name=%s, flag=%#x, mode=%#o\n", name, flag, mode);
va_end(ap);
}

上記の部分は

if (flag & O_CREAT) {

ではないでしょうか?
'|'では常にif文の結果が真になると思うのですが。


この投稿にコメントする

削除パスワード

No.24304

Re:サンプルプログラムの疑問
投稿者---かずま(2005/11/22 04:43:13)


> 上記の部分は
>
> if (flag & O_CREAT) {
>
> ではないでしょうか?

そのとおりです。ご指摘ありがとうございます。
私はいつも不完全なプログラムを書いていますが、
なかなか、それを指摘してくれる人がいなくて残念に思っていました。



この投稿にコメントする

削除パスワード

No.24281

Re:Linuxにおけるopen()の実装方法について
投稿者---επιστημη(2005/11/21 06:23:43)


>int open(const char *pathname, int flags);
>int open(const char *pathname, int flags, mode_t mode);
>
>同じ関数名でしかも引数の数が違うものをどの様に実装しているのでしょうか?

ヘッダにはどのように宣言されていますか?



この投稿にコメントする

削除パスワード

No.24282

Re:解決しました
投稿者---zero(2005/11/21 10:33:51)


かずまさん、επιστημηさん返信ありがとうございます。

>ヘッダにはどのように宣言されていますか?
/usr/include/fcntl.hに

extern int open(__const char *__file, int __oflag, ...);

とプロトタイプされていました。
可変引数については知っていたのですが、open(2)を見たら、可変引数の形で、書式が(printfのように)書かれていなかったので、疑問に思ってしまいました。

ちゃんとヘッダを確認してから質問するべきでした。
ありがとうございました。

かずまさん、open(2)の簡単な実装サンプルまで載せていただいてありがとうございました。





この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧