C言語システムコール-open

openシステムコール

概要

openはファイル操作のためのファイルディスクリプタ(ファイル記述子)を取得します。

ファイルディスクリプタはint型の数値であり、使用される値は「0」以上の数値となります。

openを実行すると、その時点でプロセスによって使用されていないファイルディスクリプタの最小の値が取得されます。


ファイルディスクリプタをオープンする際には引数flagに動作モードを指定します。

O_RDONLY 読み込み専用でオープンする。
O_WDONLY 書き込み専用でオープンする。
O_RDWR 読み書き両用でオープンする。
O_CREAT ファイルが存在しない場合には新規作成する。
O_EXCL ファイルが存在しない場合にはエラーとする。
O_TRUNC ファイルサイズを0に切り詰める。
O_APPEND 追記書き込みでオープンする。
O_NONBLOCK ノンブロッキングモードでオープンする。
O_NDELAY O_NONBLOCKと同様、ノンブロッキングモードでオープンする。
O_NOCITY オープンした端末を制御端末にしない。

fopen()について

ファイルをオープンする場合には、openシステムコールを直接使用せずにCライブラリのfopen()を用いてバッファリング機能付きでファイル操作をすることが多いといえます。

fopen()のファイルオープンモードとopenの引数の関係は以下の対応となっています。

fopen(path, "r") open(file, O_RDONLY)
fopen(path, "r+") open(file, O_RDWR)
fopen(path, "w") open(file, O_WRONLY|O_CREAT|O_TRUNC, 0666)
fopen(path, "w+") open(file, O_RDWD|O_CREAT|O_TRUNC, 0666)
fopen(path, "a") open(file, O_WRONLY|O_CREAT|O_APPEND, 0666)
fopen(path, "a+") open(file, O_RDWR|O_CREAT|O_APPEND, 0666)

サンプルプログラム


#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int
main(void)
{
    int fd = 0;
    char *path = "./tmp/datatable.lock";

    fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0666);
    if(fd < 0){
        printf("Error: open(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    if(close(fd) < 0){
        printf("Error: close(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    return(0);
}

関連ページ