私は C の初心者で、 を使用しようとしていますdup()
。この関数をテストするプログラムを作成しました。結果は、期待したものとは少し異なります。
コード:
// unistd.h, dup() test
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern void dup_test();
int main() {
dup_test();
}
// dup()test
void dup_test() {
// open a file
FILE *f = fopen("/tmp/a.txt", "w+");
int fd = fileno(f);
printf("original file descriptor:\t%d\n",fd);
// duplicate file descriptor of an opened file,
int fd_dup = dup(fd);
printf("duplicated file descriptor:\t%d\n",fd_dup);
FILE *f_dup = fdopen(fd_dup, "w+");
// write to file, use the duplicated file descriptor,
fputs("hello\n", f_dup);
fflush(f_dup);
// close duplicated file descriptor,
fclose(f_dup);
close(fd_dup);
// allocate memory
int maxSize = 1024; // 1 kb
char *buf = malloc(maxSize);
// move to beginning of file,
rewind(f);
// read from file, use the original file descriptor,
fgets(buf, maxSize, f);
printf("%s", buf);
// close original file descriptor,
fclose(f);
// free memory
free(buf);
}
プログラムは、複製された fd を介して書き込みを試み、複製された fd を閉じてから、元の fd を介して読み取りを試みます。
複製された fd を閉じると、io キャッシュが自動的にフラッシュされると予想していましたが、そうではありません。fflush()
コード内の関数を削除すると、元の fd は複製された fd によって書き込まれたコンテンツを読み取ることができなくなります。すでに閉鎖されています。
私の質問は:
これは、複製された fd を閉じると、自動的にフラッシュされないということですか?
@編集:
申し訳ありませんが、私の間違いです。理由が見つかりました。最初のプログラムでは次のようになっています。
close(fd_dup);
しかし、持っていません:
fclose(f_dup);
使用後はfclose(f_dup);
交換close(f_dup);
して動作します。
したがって、複製された fd は、適切な方法で閉じると自動的にフラッシュされます。 write()
&close()
はペアであり、fwrite()
&fclose()
はペアであり、それらを混在させるべきではありません。
実際、コードでは、複製された fd_dup をwrite()
&close()
で直接使用することができ、新しいものを作成する必要はまったくありませんFILE
。
したがって、コードは次のようになります。
// unistd.h, dup() test
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#define BUF_SIZE 1024 // 1 kb
extern void dup_test();
int main() {
dup_test();
}
// dup()test
void dup_test() {
// open a file
FILE *f = fopen("/tmp/a.txt", "w+");
int fd = fileno(f);
printf("original file descriptor:\t%d\n",fd);
// duplicate file descriptor of an opened file,
int fd_dup = dup(fd);
printf("duplicated file descriptor:\t%d\n",fd_dup);
// write to file, use the duplicated file descriptor,
write(fd_dup, "hello\n", BUF_SIZE);
// close duplicated file descriptor,
close(fd_dup);
// allocate memory
char *buf = malloc(BUF_SIZE);
// move to beginning of file,
rewind(f);
// read from file, use the original file descriptor,
fgets(buf, BUF_SIZE, f);
printf("%s", buf);
// close original file descriptor,
fclose(f);
// free memory
free(buf);
}