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

closeシステムコール

概要

closeはファイルディスクリプタをクローズして未使用状態にします。

ファイルディスクリプタが指定するファイルの操作を解放します。

closeで解放されたファイルディスクリプタは、openなどのファイルディスクリプタ取得処理によって同じ番号が再利用される可能性があります。


ファイルディスクリプタ「1(標準出力)」をcloseした直後にopenを実行すると、未使用ファイルディスクリプタで最小の値として「1(標準出力)」が割り当てられることとなります。

close(1)を実行後にopenすることでリダイレクト処理を動作させることができます。

(リダイレクト処理は通常dup()/dup2()/fcntl()などを正しく併用する必要があります。)


サンプルプログラム


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

static int
stdin_prompt(int fd)
{
    ssize_t rnum = 0;
    ssize_t wnum = 0;
    char buf[BUFSIZ];

    rnum = read(0, buf, sizeof(buf));
    if(rnum < 0){
        printf("Error: read(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

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

    if(rnum != wnum){
        printf("Error: read/write(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    return(0);
}

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

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

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

    rc = stdin_prompt(fd);

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

    return(rc);
}


関連ページ