私はLinuxシステムで "cat"関数をシミュレートするシステムコール(オープン、読み込み、書き込み)を使ってCでこの関数を実行しました。実際のものよりも遅いです...なぜ私の "cat"関数はシステムコールでLinuxの "cat"に比べて遅いのですか?
私は同じものを使用していますバッファサイズを実際の "cat"とし、 "strace"を使って同じ量のシステムコールを作っていると思います。しかし、私の "猫"からの出力は、実際の "猫"より少し遅いです。
これは私が持っているコードです:
#define BUFSIZ 32768
int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
ssize_t writtenBytes = 0;
while(writtenBytes < readBytes) {
writtenBytes += write(fdout,
buffer + writtenBytes, readBytes - writtenBytes);
if(writtenBytes == -1) {
return -1;
}
}
return 0;
}
int catPrint(int fdin, int fdout) {
char buffer[BUFSIZ];
ssize_t readBytes;
do {
readBytes = read(fdin, buffer, BUFSIZ);
if(readBytes == -1) {
return -1;
}
if(sysWriteBuffer(fdout, buffer, readBytes) == -1) {
return -1;
}
} while(readBytes > 0);
return 0;
}
私は、ファイルから読んでいる)私はcatPrint(呼び出しよりも(私がメインに引数として渡すことを、私はコードがここで必要とされていないと思います)そのファイル記述子を持つ関数と出力記述子を表す1つの関数がstdoutに出力されるようにします。
私は同じファイルをテスト用に使用しているため、実際の "cat"と私の両方の場合、テキスト全体に対してread()とwrite()が1つしかないので、なぜスローですか分かりません。テキスト全体が画面に表示されるべきではありませんか?
P.S:宿題の一部ではありませんが、ここで私の質問は遅いのですが、これを宿題とタグ付けしました。私はシステムコールを使って "cat"型関数を作成する必要がありました。私はちょうど少し遅い私のコードに興味を持っています。私から愚かで解決
問題:
は、私はちょうど、同じファイル上でLinuxのオリジナル猫次々と数回呼び出すことを決めた、と私はちょうどそれがまた、時代のいくつかを遅らせたことに気づいIそれは私のものと同じくらい遅いです。私はすべてがうまくいくと思います...
この人のようなあなたの時間を無駄にして申し訳ありません。
IMHOでは、「宿題」タグは誤解を招きます。あなたの質問は興味深い背景事実に関係しています。 「宿題」とは、面倒な初心者の仕事、または(規模の反対側の)クイズの質問のいずれかを意味します。 –
2番目のwrite()でエラーが発生した場合、エラー(つまり、-1を返すwrite)処理が不正です。 – jpalecek
あなたは宿題タグを削除することができます。もしそれが良いと思えば... jpalecekとはどういう意味ですか?私は補助機能しか持っていません(システムコールのように)書き込みは1つだけです。その補助関数内のwrite()が失敗した場合、catPrint()が呼び出された場所に-1を返す必要があります。 –