Nao000のぶろぐ

蝶を追っている少年になりたい

C言語で作ったchmodで10進数を渡した

以下の書籍で chmod コマンドを作成しました。 「ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道」

nao@nao-System-Product-Name:~/workspace/learn/linux-programming/chmod$ touch example
nao@nao-System-Product-Name:~/workspace/learn/linux-programming/chmod$ ls -l
合計 20
-rwxrwxr-x 1 nao nao 16176 11月 17 09:13 chmod
-rw-rw-r-- 1 nao nao   377 11月 17 09:12 chmod.c
-rw-rw-r-- 1 nao nao     0 11月 17 09:29 example

こんな感じで 664 のパーミッションの example ファイルを用意します。

このファイルのパーミッションを 777 にしたつもりでした。

nao@nao-System-Product-Name:~/workspace/learn/linux-programming/chmod$ ./chmod 777 example
nao@nao-System-Product-Name:~/workspace/learn/linux-programming/chmod$ ls -l
合計 20
-rwxrwxr-x 1 nao nao 16176 11月 17 09:13 chmod
-rw-rw-r-- 1 nao nao   377 11月 17 09:12 chmod.c
-r----x--t 1 nao nao     0 11月 17 09:29 example

結果は -r----x--t 411 でした。 t ってなんだ。

スティッキービット というらしい。ディレクトリに対して使うのが一般的っぽい。ディレクトリに対して使えば、所有者以外のユーザはその配下のファイルの更新・削除ができなくなるらしい。設定するときは 1777 みたいに設定するらしい。

じゃあ、なんで 777 にしたつもりが 411 になったかというと、 ./chmod 777 example777 は 10 進数として解釈されるためでした。 10 進数の 777 は 2 進数では 1100001001 です。これがそのまま解釈されたみたいです。

正しくは以下のように 0777 で頭に 0 をつけて 8 進数として解釈させます。

nao@nao-System-Product-Name:~/workspace/learn/linux-programming/chmod$ ./chmod 0777 example
nao@nao-System-Product-Name:~/workspace/learn/linux-programming/chmod$ ls -l
合計 20
-rwxrwxr-x 1 nao nao 16176 11月 17 09:13 chmod
-rw-rw-r-- 1 nao nao   377 11月 17 09:12 chmod.c
-rwxrwxrwx 1 nao nao     0 11月 17 09:29 example