0

私は Linux の C プログラムがファイルに書き込む方法を分析していましたが、要約すると次のようになります。

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include "restart.h"
#define CREATE_FLAGS (O_WRONLY | O_CREAT | O_APPEND)
#define CREATE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)

int main(void) {

   int fd;

   fd = open("my.file", CREATE_FLAGS, CREATE_MODE);

   dup2(fd, STDOUT_FILENO);

   r_close(fd) ;

   write(STDOUT_FILENO, "Hello World", 11) ;

   return 0;
}

2 つの小さなヘッダー ファイル r_close.c と restart.h は、こ​​のリンクにあります。

だから私の質問は、プログラムがファイルにどのように書き込んでいるか知りたいということです。たとえば、次のように c# で行うことの違いは何ですか。

    static void Main(string[] args)
    {
        var file = System.IO.File.OpenWrite("my.file");
        file.Write(System.Text.Encoding.ASCII.GetBytes("Hello World"), 0, 11);
        file.Close();
    }

http://www.mkssoftware.com/docs/man3/dup2.3.aspなどの多くのリンクで dup2 メソッドの説明を見ましたが、 基本的に何をするのか理解するのに苦労しています。

4

2 に答える 2

2
fd = open("my.file", CREATE_FLAGS, CREATE_MODE);

これにより、ファイルが作成されて開かれ、ファイルの最後ですべての書き込みが発生するappendmoreに書き込むために開きます。

dup2(fd, STDOUT_FILENO);

これにより、新しく開いたファイルのファイル記述子が、プログラムの標準出力記述子である記述子の上にコピーされます。これらの2つの記述子は、同じ開いているファイルの説明を参照するようになりました。

r_close(fd) ;

これにより、から取得した記述子が閉じられopen、コピーはそのまま残ります。

write(STDOUT_FILENO, "Hello World", 11) ;

これにより、プログラムの標準出力ストリームに書き込まれます。これは、新しいファイルを開いたときに取得した開いているファイルの説明と同じです。

于 2012-09-16T19:41:08.830 に答える
1

dup2() 関数は、開いているファイル記述子を複製します。具体的には、F_DUPFD 定数コマンド値を使用し、3 番目の引数に fildes2 を使用して、fcntl() 関数によって提供されるサービスへの代替インターフェースを提供します。複製されたファイル記述子は、元のファイル記述子とロックを共有します。

呼び出し:

fid = dup2(fildes, fildes2);

次と同等です。

close(fildes2);
fid = fcntl(fildes, F_DUPFD, fildes2);

これが意味することは、OS が開いているファイル記述子を保持する必要があるテーブルを変更したことです。機能を利用していfcntl()ます。fcntl() は、開いているファイル記述子の制御を提供します。基本的に、int を int にコピーします。ただし、システムコールを使用してそれを行います。OS リソースを変更するためです。システムへのあなたの言葉: FileTable の Index を知っていますか? はい?FilePointer を別のインデックスにコピーします。(他にもいくつかありますが、今のところ無視する必要があります。)

Re: 質問の 2 番目の部分、違いは何ですか?

彼らは基本的に同じことをします。おそらくまったく同じ文字がファイルに書き込まれます。1 つの余分な処理を行います。それだけdup2() STDOUT_FILENOです。ファイルに。それは標準出力が何であるかを変更します。私が間違っていなければ、コードは通常コンソールに送られるすべての出力をfd、あなたの場合は にリダイレクトします"my.file"それが、リストしたC#Cの主な違いです。

また、 「Hello World」をファイルdup2()に書き込むことだけを考えている場合、このサンプルの全体が無意味であることに注意してください。それはちょっと行くようなものです。あなたの例では、余分なステップは何もしません。int x = 5; int y = x; Console.WriteLine(y);

もう 1 つのより一般的な違いは、C# はプログラマーから多くの低レベルのものを隠していることです。C でコーディングしている間、より簡単に低レベルのファイルとシステム操作を行うことができます。欠点は、下位レベルのものをより多くコーディングする必要があることです。ほとんどの場合、それが実際にどのように発生するかは気にしませんが、実際に発生することは重要です。多くの場合、C# でコーディングする方が迅速です。これは、すべての低レベルの処理が既に適切に処理されているためです。-- 理解するのに役立つかもしれないトピックから少し離れたポイント

最後に、推測を危険にさらします。

私は Linux の C プログラムがファイルに書き込む方法を分析していましたが、要約すると次のようになります。

ファイルへの通常の書き込みではなく、I/O 操作を処理するプログラムを分析していました。それは説明しdup2()ます。

于 2012-09-16T20:49:55.493 に答える