無料Wikiサービス | デモページ
検索

アクセス数
最近のコメント
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
はじめ - ノース
はじめ - ノース
はじめ - 楽打連動ユーザー
はじめ - 楽打連動ユーザー
Adsense
広告情報が設定されていません。

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を介してのシステムコールは有りません。

検証サンプル
#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)                           = ?

補足

細分化したデータを繰り返し入出力する場合は、fopenによる入出力が効果的と言えます。ただし、リアルタイムにデバイスに入出力されないため、他のプロセスでもそのデバイスを参照している場合は、openでの入出力となります。


最終更新 2015/10/18 14:40:16 - north
(2015/10/17 15:35:36 作成)