2011.12.19
前へ
次へ
目次へ戻る
ホームページトップへ戻る

パソコンをつくろう!(パソコン自作のすすめ)
組み立てキットを使って自作に挑戦!

[第273回]


●ユーザーのままで実行したい

パラレルポート出力プログラムを普通のユーザーの権限で実行するとSegmentation faultエラーになってしまい、実行することができません。
これは、ポートアドレスに出力を許可するためのioperm()がrootでなければ実行できないからです。

まあ私は個人が所有するパソコンなら別にrootで実行したっていいじゃないの、と思うのでありますが、一般的にはそういうことは避けるべきだ、というように説く方が多いようです。
せっかくのパラレルポートを制御するプログラムもrootでは実行したくない、ということになりますと、困ってしまいます。
そういう場合にはドライバを作ってそれをカーネルに組み込んで使う、ということにするのだそうです。
私は、そちらのほうが余程こわいと思うのですけれど。

ところが、たまたま、ユーザーでも実行できるじゃないの、という方法をみつけてしまいました。
以下順に説明をしていくことにいたします。
その作業のために、今まではgccにオプションをつけないで、そのままコンパイルしてきたところを、今度は実行ファイルに名前をつけてコンパイルします。
ソースプログラムは前回の最後に作成したouttest6.cを使います。

gcc −o outtest6 outtest6.c

このようにgccに −o(小文字のオー)をつけて、その後に実行ファイル名を指定します。
そのさらに後にソースプログラムを指定します。
いままでは実行ファイル名を指定しませんでしたから、その場合には実行ファイル名として常にa.outという名前のファイルが作られましたが、上のように指定すると、指定した名前で実行ファイルが作成されます。
下はそのように実行したところです。

ちゃんと実行ファイルouttest6が作成されたかどうかを確認するためにlsコマンドを実行しています。
ただのlsではなくて
ls −l
としているのは、ファイルのパーミッション(許可状態)を確認してみたかったからです。

話のついでに。
このls −lの小文字のエルも数字の1との区別がつきにくい書体です。
昔はBASICでもFORTRANでもCOBOLでもアルファベットの大文字を使いましたから、エルと1との混同はありませんでしたが、Cでは小文字も使いますから紛らわしくて困ります。
ABCLをabclと書くとabc1と間違う恐れが出てきます。
ですから私はそのような場合には、わざとabcLのように書くことにしています。
[第271回]でO(オー)と0(ゼロ)との区別について書きましたが、上の画面を見ますと、リナックスではちゃんとl(エル)と1(数字のイチ)とをはっきり使い分けた書体になっています。
こういうところに、Windowsとリナックスの立ち位置の違いが垣間見えるような気がします。

お話をもとに戻します。
ファイルのパーミッションは左の−rwxrwxr−xに示されています。
一番左の−はファイルであることを示す記号です。次からは3文字ずつ3つに区切って考えます。
rwx rwx r−x です。左から、このファイルの所有者、所有者の所属するグループ、そして他人です。
rは読み出し許可、wは書き込み許可、xは実行許可を示します。−は許可されないことを示しています。
この例では他人は読み出しと実行は許可されますが書き込みは許されません。

今回重要なのはその次の表示です。
ubuntu ubuntuと表示されています。
前のubuntuはこのubuntu11.10をインストールしたときのユーザー名です。ここはこのファイルの所有者がだれであるかを示しています。
後のubuntuはその所有者が所属するグループです。

さて、その下ではユーザーのままouttest6を実行しています。
上に書きましたように、outtest6をユーザー(ubuntu)が実行すると、Segmentation faultが表示されてしまい、実行されません。
その次のところでは、rootで実行するために
sudo ./outtest6
と入力しています。
パスワードが要求されますから、それを入力すると、やっとouttest6が正しく実行され、LEDが点滅しました。

●rootでコンパイルする

outtest6をユーザーが実行できるようにするためには、実はちょいとしたおまじないが必要です。
その一つ目は、必ずrootでコンパイルする、ということです。
いままでのようにユーザーのままでコンパイルしては、その次のおまじないが利きません。
下のように、sudoをつけて
sudo gcc −o outtest6 outtest6.c
と入力します。

sudoをつけて、rootでコンパイルして作成されたouttest6が、先ほどユーザーのままコンパイルして作成されたファイルとどう違うのか、同じように
ls −l
を実行して確認をしています。
所有者がrootになりました。

その次に、ユーザーのまま
./outtest6
を実行しています。
結果はいままでと同じようにSegmentation faultが表示されて、実行はできません。

その次のところで
sudo ./outtest
とすると、正しく実行されることも今までと同じです。

なんだ。
rootでコンパイルしても、ちっとも変わらないじゃないか。

そこで、最後のおまじないをします。

●chmod u+s

これがそのおまじないです。
sudo chmod u+s outtest6
を実行します。
普通はここでパスワードを要求されますが、先ほどから続いて同じ「端末」のまま実行していますから、今回はパスワードは要求されません。

もう一度
ls −l
を実行すると、今までグリーンで表示されていたファイル名が赤のバックに白抜きで表示されました。

u+sはリナックスのマニュアルを見ますと、「セット・ユーザーIDを付加する」などと説明されています。
意味不明であります。
意味不明ではありますが、そのようにしますと、ファイル名が赤で表示されますから、何やら恐ろしいことがおきたように思えます。

恐る恐るユーザーのまま
./outtest6
を実行してみますと。

おお。
Segmentation faultが表示されることなく、普通にouttest6が実行され、LEDが点滅しました。
この状態は、Ubuntu11.10を終了して、あらためて起動しても維持されています。

再起動後にあらためて、ユーザーのまま./outtest6を実行してみました。

Segmentation faultが表示されることなく、普通にouttest6が実行され、LEDが点滅しました。

今回はちょっと時間がなくなってしまいましたので、
chmod u+s
についての説明ができませんでした。
それについては次回に説明いたします。

パソコンをつくろう![第273回]
2011.12.19upload

前へ
次へ
目次へ戻る
ホームページトップへ戻る