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) = ?






