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

unlinkシステムコール

概要

unlinkはファイルのエントリ(ディレクトリへのエントリ)を削除します。

rm(ファイル削除)コマンドにおいてunlinkシステムコールが使用されています。


ファイルはディレクトリへのエントリを削除されると、リンクカウントが1つ減ります。

ファイルが別のハードリンクを保持している場合、ファイルの実体は削除されません。

ファイルのリンクカウントが0となった場合、ディレクトリへのエントリだけでなく、ファイルの実体も削除されます。

ただし、実行中プロセスがファイルディスクリプタ操作中であれば、unlinkを実行しても削除はされません。


unlinkは対象ファイルへの書き込み許可パーミッションは必要ではなく、対象ファイルが存在するディレクトリへの書き込み権限が必要です。

シンボリックリンクに対してunlinkを実行すろと、シンボリックリンク自体が削除されます。


サンプルプログラム


#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

static int
rename_hardlink(const char *src, const char *dst)
{
    int rc = 0;

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

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

    return(0);
}

int
main(void)
{
    int rc = 0;

    rc = rename_hardlink("./tmp/memo1.txt", "./tmp/memo2.txt");
    if(rc < 0) return(-1);

    return(0);
}

関連ページ