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

accessシステムコール

概要

accessは指定ファイルに対する実ユーザ及び実グループでのアクセス権有無について確認します。


複数あるアクセス権を確認するシステムコールの中で、実効プロセスの実効ユーザ及び実効グループではなく、実ユーザ及び実グループの権限を確認することがaccessシステムコールの特徴といえます。

accessシステムコールをrootセットユーザIDのコマンドから呼び出した場合、root権限ではなく設定されているユーザ権限でアクセス権限の確認が行われます。

accessを利用することで、セットユーザIDまたはセットグループIDを設定したコマンドを、ユーザ権限またはグループ権限でアクセスできるかどうか判定することが可能になります。


アクセス権を確認するための条件フラグは以下の通りです。

フラグは「|」(パイプ)を用いてAND条件で列挙可能です。

R_OK 読み込み権限を確認する。
W_OK 書き込み権限を確認する。
X_OK 実行権限を確認する。
F_OK ファイルの存在を確認する。

サンプルプログラム


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

/*!
 * @brief      ファイルが実行可能であるか確認する。
 * @param[in]  filepath  ファイルパス名
 * @return     1         実行権限がある
 * @return     0         実行権限がない
 */
static int
is_exec(char *filepath)
{
    int rc = 0;

    /* 読み込み権限と実行権限を確認する。 */
    rc = access(filepath, R_OK|X_OK);
    if(rc < 0) return(0);

    return(1);
}

int
main(int argc, char *argv[])
{
    int rc = 0;

    if(argc != 2){
        fprintf(stderr, "Usage: %s <path>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    rc = is_exec(argv[1]);
    if(rc == 1){
        fprintf(stdout, "Executable file: %s\n", argv[1]);
    }else{
        fprintf(stdout, "Permission Deny: %s\n", argv[1]);
    }

    exit(EXIT_SUCCESS);
}


関連ページ