1

私の質問は、コマンドラインでファイル名ではなくファイル記述子番号を取るように、以下のプログラムをどのように変更すればよいですか? どんな助けでも大歓迎です。ありがとうございました。

include "csapp.h"

int main (int argc, char **argv) 

{

    struct stat stat;
    char *type, *readok;

    /* $end statcheck */
    if (argc != 2) {
        fprintf(stderr, "usage: %s <filename>\n", argv[0]);
        exit(0);
    }
    /* $begin statcheck */
    Stat(argv[1], &stat);
    if (S_ISREG(stat.st_mode))     /* Determine file type */
        type = "regular";
    else if (S_ISDIR(stat.st_mode))
        type = "directory";
    else 
        type = "other";
    if ((stat.st_mode & S_IRUSR)) /* Check read access */
        readok = "yes";
    else
        readok = "no";

    printf("type: %s, read: %s\n", type, readok);
    exit(0);
}
/* $end statcheck */
4

4 に答える 4

1

やりたいことは簡単です。argv [1]を文字列から整数に(strtolを使用して)変換する必要があります。次に、呼び出しをstat()からfstat()に変更します。引数が実際に数値(ファイル記述子が何であるか)であることを確認する必要がない場合は、stat()呼び出しを次のように変更するだけです。

fstat(atoi(argv[1]), &stat);

そうは言っても、私は尋ねなければなりません、これの目的は何ですか?

于 2009-10-29T06:23:50.987 に答える
1

ファイル記述子は、プロセスに対して一意であると見なす必要があります。stdin/out/err でさえ、2 つの別々のプロセスのパイプではまったく異なりますが、fd は同じです。

もちろん、新しいプロセスを作成する方法はたくさんありますが、fd を保存する方法を使用する場合は、とにかくコマンド ラインでそれらを渡しません。

于 2009-10-29T07:45:21.227 に答える
0

プロセスまたは親プロセス内から開かれていないファイル記述子に対して何かをしようとしてもうまくいきません。ファイル記述子は、プロセス/親プロセス内で一意です。

于 2009-10-29T06:31:30.737 に答える
0

FD 番号はプロセス (およびその子) ごとのプロパティであるため、親プロセスが開いているファイルの fd を所有している場合にのみ、子 (一般にフォークされた) は継承された fd 番号をコマンドパラメーターとして受け入れ、使用できます。それ; そうでなければ、よく知られている「STDOUT」または「STDERR」などを使用しない限り、方法はありません。

于 2009-10-29T07:47:05.357 に答える