open/fopenの相違
openは直接入出力システムコールをコールしますが、fopenはユーザ空間バッファを介して、fopenで取得したファイルIDをfp->_filenoに設定し入出力システムコールをコールします。
ファイルIDは、current->files->fdt[FILE ID]で、struct fileを取得するインデックスです。そのメンバーのstruct file_operations *f_opのコールバック関数をコールする事で、ファイルの入出力を行います。従ってfopenも、openと同じようにFILE IDを介して入出力を行っています。そもそもFILEを介してのシステムコールは有りません。
検証サンプル
ファイルIDは、current->files->fdt[FILE ID]で、struct fileを取得するインデックスです。そのメンバーのstruct file_operations *f_opのコールバック関数をコールする事で、ファイルの入出力を行います。従ってfopenも、openと同じようにFILE IDを介して入出力を行っています。そもそもFILEを介してのシステムコールは有りません。
検証サンプル
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> void hoge_open() { int fd; fd = open("babakaka_open", O_CREAT | O_RDWR); write(fd, "12345", 5); write(fd, "67890", 5); close(fd); } void hoge_fopen() { FILE *fp; fp = fopen("babakaka_fopen", "w"); fputs("12345", fp); printf("fputsed:%s\n", fp->_IO_write_base); fputs("67890", fp); printf("fputsed:%s\n", fp->_IO_write_base); fclose(fp); } void main(void) { hoge_open(); hoge_fopen(); }
[root@localhost test]# ./a.out fputsed:12345 fputsed:1234567890
[root@localhost test]# strace ./a.out : open("babakaka_open", O_RDWR|O_CREAT, 01001114464) = 3 write(3, "12345", 5) = 5 <-ファイルへの書き込み write(3, "67890", 5) = 5 <-ファイルへの書き込み close(3) = 0 brk(0) = 0x878d000 brk(0x87ae000) = 0x87ae000 brk(0) = 0x87ae000 : : open("babakaka_fopen", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7792000 : write(1, "fputsed:12345\n", 14fputsed:12345) = 14 write(1, "fputsed:1234567890\n", 19fputsed:1234567890) = 19 write(3, "1234567890", 10) = 10 <-ファイルへの書き込み close(3) = 0 munmap(0xb7792000, 4096) = 0 exit_group(0) = ?