【掲示板ご利用上の注意】

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

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


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

No.22507

fcntl()システムコール
投稿者---AKUMA(2005/08/07 23:24:07)


AKUMAです。
fcntl()のシステムコールにについて調べているのですが
本の記述を読んだのですが、翻訳の関係かでうまく読み取
れません。

誰か分かる人が居ればご指導ください。

質問をします・・・・

「新しいファイル・ディスクリプタはargに与えられた値以上の有効な値が与え
られます。」と書いてありますが、この意味がわかりません、どういう意味か
わかりすか?何か例で示していただければありがたいのですが・・・

F_GETFD     close-on-exec**フラグを最下位ビットに得ます。 ← セットすると
いう意味ではないのですか?ちょっとわからないです。
                戻り値:最下位bitが0・・・実行中はファイルをオープンしたま
まです。

F_SETFD      close-on-execフラグを設定します。 ← こちらはセットするみたい
ですね、となると上記のは何ですかね・・・
         argの最下位bitに1(セット)または0(クリア)を設定します。←こ
れもどういう状態かわかりませんね

F_GETFL       ファイル・ステータス・フラグ**を戻り値として得ます。

 F_SETFL       ファイル・ステータス・フラグをargで設定します。←どのように設
定するのですか?




概要 ファイル・コントロール

 ファイル・ディスクリプタ fcntlの操作を指定するコマンド
               ↓      ↓
int fcntl(int fildes , int cmd , arg);
 ↑                ↑
コール成功・・・後述      パラメータ 
コール失敗・・・-1

説明
○各cmdとfcntlの戻り値との関係は次のとおりです。
 F_DUPFD ファイル・ディスクリプタを複製して、新しいファイル・ディスクリプタ
を
        戻り値に返します。
        新しいファイル・ディスクリプタはargに与えられた値以上の有効
な値が与え
        られます。
  対象のファイルはオリジナルのファイルと同じものです。
  次のものはそのままコピーされます。
   -ファイルリード/ライトポインタ
   -アクセスモード
   -ファイル・ステータス・フラグ*

 F_GETFD close-on-exec**フラグを最下位ビットに得ます。
  戻り値:最下位bitが0・・・実行中はファイルをオープンしたままです。

 F_SETFD       close-on-execフラグを設定します。
        argの最下位bitに1(セット)または0(クリア)を設定します。

 F_GETFL       ファイル・ステータス・フラグ**を戻り値として得ます。

  F_SETFL       ファイル・ステータス・フラグをargで設定します。

 F_DUPFD等は<fcntl.h>に定義されてます。

 F_SETFD,F_SETFLによる設定はファイルがopenされている間だけ有効です。 

ご指導よろしくお願いします。




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:fcntl()システムコール 22509 かずま 2005/08/08 01:26:10
<子記事> Re:fcntl()システムコール 22510 かずま 2005/08/08 01:53:02


No.22509

Re:fcntl()システムコール
投稿者---かずま(2005/08/08 01:26:10)


> 「新しいファイル・ディスクリプタはargに与えられた値以上の有効な値が与え
> られます。」と書いてありますが、この意味がわかりません、どういう意味か
> わかりすか?何か例で示していただければありがたいのですが・・・
$ cat file
abcdefghijklmnopqrstuvwxyz
$ cat a.c
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main(void)
{
    int fd1, fd2, n;  char buf[16];

    fd1 = open("file", O_RDONLY);
    n = read(fd1, buf, 12);
    printf("fd1=%d, buf=[%.*s]\n", fd1, n, buf);
    fd2 = fcntl(fd1, F_DUPFD, 6);
    n = read(fd2, buf, 12);
    printf("fd2=%d, buf=[%.*s]\n", fd2, n, buf);
    close(fd2);
    close(fd1);
    return 0;
}
$ gcc a.c
$ ./a.out
fd1=3, buf=[abcdefghijkl]
fd2=6, buf=[mnopqrstuvwx]
$

fcntl(fd1, F_DUPFD, 6) は、4 や 5 が空いているのに 6 を返します。
もし、6 が既に使われていたら、7 を返すでしょう。



この投稿にコメントする

削除パスワード

No.22511

argについて・・・数値について
投稿者---AKUMA(2005/08/08 05:17:00)


かずま 様

お忙しい中、お答えいただきありがとうございます。

すいません、本当は、プログラムを見ただけで読み取らなければ
いけないのですが、読み取れません。

>> 「新しいファイル・ディスクリプタはargに与えられた値以上の有効な値が与え
>> られます。」と書いてありますが、この意味がわかりません、どういう意味か
>> わかりすか?何か例で示していただければありがたいのですが・・・
><pre>

この数値というのは、どのようなものと捕らえればよろしいですか?
argの数値についてです・・・
argに数値を与えるのですよね・・・
戻ってくるのでは、なくて・・・

>fcntl(fd1, F_DUPFD, 6) は、4 や 5 が空いているのに 6 を返します。
>もし、6 が既に使われていたら、7 を返すでしょう。</pre>

ご指導ください。



この投稿にコメントする

削除パスワード

No.22512

Re:argについて・・・数値について
投稿者---かずま(2005/08/08 09:58:54)


> この数値というのは、どのようなものと捕らえればよろしいですか?

ファイルディスクリプタ。


この投稿にコメントする

削除パスワード

No.22514

わかったと思います・・・
投稿者---AKUMA(2005/08/08 12:22:13)


かずま 様

お忙しい中、お答えいただきありがとうございます。

>> 「新しいファイル・ディスクリプタはargに与えられた値以上の有効な値が与>> え
>> られます。」と書いてありますが、この意味がわかりません、どういう意味か
>> わかりすか?何か例で示していただければありがたいのですが・・・
>fcntl(fd1, F_DUPFD, 6) は、4 や 5 が空いているのに 6 を返します。
>もし、6 が既に使われていたら、7 を返すでしょう。
>> この数値というのは、どのようなものと捕らえればよろしいですか?
>
>ファイルディスクリプタ。

上記のことから総合して、普通であれば、4や5が空いているのにargに6が
与えられているので、それ以上の値である、6か7が振られるということですね。

やっと理解できました。

あってますよね上記の解釈で?

ご指導ありがとうございました。




この投稿にコメントする

削除パスワード

No.22510

Re:fcntl()システムコール
投稿者---かずま(2005/08/08 01:53:02)


他にも質問があったようですね。

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main(void)
{
    int fd, flag;

    fd = open("file", O_RDONLY);
    flag = fcntl(fd, F_GETFL);
    printf("flag=%o\n", flag);
    flag = fcntl(fd, F_GETFD);
    printf("close-on-exec=%d\n", flag & 1);
    fcntl(fd, F_SETFD, 1);
    flag = fcntl(fd, F_GETFD);
    printf("close-on-exec=%d\n", flag & 1);
    flag = fcntl(fd, F_GETFL);
    printf("flag=%x\n", flag);
    close(fd);
    return 0;
}

open で O_RDONLY しか指定していないから、最後の flag の値は 0 かな?



この投稿にコメントする

削除パスワード

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