C言語入門講座。関数、サンプル集を参考にして、 C言語をマスターしよう。初心者から上級者まで。

ファイルのアクセス許可情報(パーミッション)を変更する

2012.08.10

chmod関数は、ファイルやディレクトリ(フォルダ)のアクセス許可情報(パーミッション)を変更します。なお、この機能を使うには、実行プロセスがアクセス許可情報を変更できる権限を持っていることが必要です。

この関数は、C言語のライブラリ関数(標準関数)ではありませんので、コンパイラにより、使えない場合があります。

#include <sys/stat.h>
int chmod(const char *path, mode_t mode);

*pathは変更するファイルのパス名を指定します。
modeは許可情報を指定します。

戻り値として、処理が成功した場合は0を、失敗した場合は-1を返します。

第2引数のmodeは、次の値のORをとったもので指定します。

モード 意味
S_ISUID 04000:実行時のセット・ユーザー・ID(set user ID)。
S_ISGID 02000:実行時のセット・グループ・ID(set group ID)。
S_ISVTX 01000:スティッキー(sticky)ビット。
S_IRUSR 00400:所有者(owner)による読み取り(read)。
S_IWUSR 00200:所有者による書き込み(write)。
S_IXUSR 00100:所有者による実行(execute)・検索(search)。
S_IRGRP 00040:グループ(group)による読み取り。
S_IWGRP 00020:グループによる書き込み。
S_IXGRP 00010:グループによる実行・検索。
S_IROTH 00004:他人(others)による読み取り。
S_IWOTH 00002:他人による書き込み。
S_IXOTH 00001:他人による実行・検索。

プログラム 例

#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char **argv)
{
  char    ans;
  int     return_code = 0;

  if (argc == 2) {
    printf('%sに実行許可を与えます。よろしいですか(y/n)==> ', *(argv+1));
    scanf('%c', &ans);

    if (ans == 'y' || ans == 'Y') {
      /* 所有者・グループ・他人による実行を許可 */
      if (chmod(*(argv+1),
                S_IRUSR | S_IWUSR | S_IXUSR |    /* rwx */
                S_IRGRP | S_IXGRP |              /* r-x */
                S_IROTH | S_IXOTH) == 0) {       /* r-x */
        printf('実行許可を与えました\n');
      }
      else {
        printf('実行許可を与えられませんでした\n');
        perror('');
        return_code = 1;
      }
    }
    else {
      printf('キャンセルします\n');
    }
  }
  else {
    printf('実行時引数の数が不当です\n');
    return_code = 2;
  }

  return return_code;
}

例の実行結果

$ cd DIR1
$ ls -l
合計 8
-rw-r--r-- 1 user  users 39 2008-07-29 10:13 hello_1.sh
-rw-r--r-- 1 root  root  39 2008-07-29 10:43 hello_2.sh
$ ./hello_1.sh
bash: ./hello_1.sh: 許可がありません
$
$ cd ..
$ ./chmod.exe ./DIR1/hello_1.sh
./DIR1/hello_1.shに実行許可を与えます。よろしいですか(y/n)==> y
実行許可を与えました
$
$ cd DIR1
$ ls -l
合計 8
-rwxr-xr-x 1 user  users 39 2008-07-29 10:13 hello_1.sh
-rw-r--r-- 1 root  root  39 2008-07-29 10:43 hello_2.sh
$ ./hello_1.sh
Hello.
bye.
$
$ cd ..
$ ./chmod.exe ./DIR1/hello_2.sh
./DIR1/hello_2.shに実行許可を与えます。よろしいですか(y/n)==> y
実行許可を与えられませんでした
Operation not permitted
$

関連記事