Logo
Java Web Wizardry Design Trivia Links
Wizardry > Mac OSX and UNIX
Mac OS X のちょっとした疑問

Mac OS X を使っていて、あれ?これってどうするのかなといったちょっとした疑問についてまとめてあります。といっても UNIX ユーザーから見たの疑問なので、UNIX を使ったことがない方にはあまり役にたちませません :-)

質問
答え
root になるには? Terminal で sudo passwd root と実行して root のパスワードを設定する。はじめに聞いてくるパスワードは現在ログインしているユーザーのパスワードを入力。NetInfo を使って設定する方法はこちら
シングルユーザーモードで起動するには?

起動音がしたらすぐに Command + S を押す。ルートパーティションを書き込み可能にマウントし直す方法は(# はプロンプト)

    # mount -uw /
起動時にステータスを表示したい場合は? 起動音がしたらすぐに Command + V を押す。
コンソールモードにするには? Aqua のログイン画面で、アカウント >console でログインする。パスワードは入力しない。コンソールモードになると、キーボードが JIS 配列では無くなるので注意が必要。何処で変えるのかわかりません。ログインして、ログアウトすれば Aqua が起動されるが、ログインせずにそのまま Aqua に戻りたい時は Ctrl+D をタイプする。
コマンドラインから NetInfo データーベースの情報を見るには?

niutil コマンドを使用する。

データーベースのリストを見る (# はプロンプト)

    # niutil -list . /
    1        users
7 groups
27 machines ...

フィールドの内容を見る

    # niutil -read . /users/dayan
    home: /Users/dayan
    uid: 502
    _shadow_passwd:
    name: dayan
    gid: 20
    ...

また、nidump(フィールド内の情報を見る)、niload(NetInfo データーベースに登録する)といったコマンドが用意されている。

コマンドラインからユーザー登録する方法は?(ユーザーdayan を追加)
データベースへのエントリを作る: niutil -create / /users/dayan
シェルを設定: niutil -createprop / /users/dayan shell /bin/tcsh
実名を登録: niutil -createprop / /users/dayan realname "Dayan"
uid を設定: niutil -createprop / /users/dayan uid 502
gid を設定: niutil -createprop / /users/dayan gid 20
ホームディレクトリを設定: niutil -createprop / /users/dayan home /Users/dayan
パスワードのエントリを作成: niutil -createprop / /users/dayan _shadow_passwd
パスワードを設定: passwd dayan
wheel グループに加える: niutil -appendprop / /groups/wheel users dayan
ネットワークに関する情報は?

基本的なホストの設定は、/etc/hostconfigで行う。/etc/iftab にインターフェースの情報を記述する。

DHCP を利用する場合

/etc/iftab: en0 inet -DHCP-
/etc/hostconfig: HOSTNAME=-AUTOMATIC-
ROUTER=-AUTOMATIC-
NFS の設定は? /etc/exports ファイルを作るタイプの設定方法。
OS 立ち上げ時に起動されるプロセスを設定するには?

Mac OS X では、SystemStarter というプログラムが起動したいサービスのスクリプトを実行します。SystemStarter は、/System/Library/StartupItems/ にあるスクリプトを起動します。

スクリプトの追加方法: Apache の場合、/System/Library/StartupItems/Apache/Apache というシェルスクリプトを以下の形式で作成する。この Apache というディレクトリー名やファイル名はユニークなものならば何でも構わない。

    #!/bin/sh
    ##
    # Start Web Server
    ##
    . /etc/rc.common
 
    if [ "${WEBSERVER:=-NO-}" = "-YES-" ]; then
        ConsoleMessage "Starting web server"
        /usr/sbin/apachectl start
    fi

さらに、/System/Library/StartupItems/Apache/StartupParameters.plist ファイルを作成する。

    {
        Description   = "Apache web server";
        Provides      = ("Web Server");
        Requires      = ("Disks", "Resolver");
        Uses          = ("NFS", "Network Time");
        Preference    = "None";
        Messages =
        {
            start = "Starting Apache web server";
            stop  = "Stopping Apache web server";
        };
    }

最後に、/etc/hostconfig に以下の行を追加します。

    WEBSERVER=-YES-

/etc/hostconfig に追加するシェル変数は、ユニークなものでなくてはならず、起動スクリプトで if 文に使用したものと同じでなければならない。

これらの事でわかるように、スクリプト等を作成したなら /etc/hostconfig に登録された各変数の値を -YES- や -NO- とすることで、OS 起動時にサービスを開始するかどうか決定できます。

ディスクのマウント方法は?

自動的にマシンに接続された全てのファイルシステムを探し、automounter が自動的に、全てのファイルシステムをマウントするようになっている。/etc/hostconfigの中のAUTODISKMOUNT変数を-NO-に変えたらどうなるのだろう? Automount をやめて /etc/fstab に記述すれば、マウントしたいものだけマウントできるようなことを何処かで見ましたが実際には試していません。

Mac OS X のバイナリーフォーマットは? Mac OS X は、Mach-O (Mach Object) というバイナリーフォーマットを採用している。ELF ではなく、ELF とも互換はありません。
コンパイラにおける注意

バージョン
Mac OS X (Build 4K78) に付いてきた Development Tools に含まれるコンパイラは、gcc 2.95.2 がベース。Mac OS X 10.2.x からは、gcc 3 がベースになりました。

コンパイルオプション
いろいろな情報を出力してくれるので、コンパイルする際に -Wall コマンドラインオプションを必ずつけることをお勧めします。
Mac OS X 特有のプリデファインドシンボルは?
__APPLE__
/usr/lib/libc.a は?
/usr/lib/libSystem.B.dylib になります。リンカで最後に -lSystem をリンクしています。

シェアードライブラリーの作成
ライブラリを作る時は
cc -dynamiclib -undefined suppress -install_name libFoo.dylib -o libFoo.dylib a.o b.o c.o ...
とします。この時、標準ライブラリの多重定義が出るようならコンパイルオプションで -nodefaultlibs または -nostdlib をさらに指定します。

また、シェアードライブラリーをリンクする場合、Mac OS X のダイナミックリンクの仕組みが他の UNIX とはちょっと異なる(シェアードライブラリーのロードの仕方が違う)ので、リンカに -bind_at_load を指定します。(コンパイラ cc で指定する時は -Xlinker -bind_at_load を指定)

dyld 形式のダイナミックライブラリ
UNIX (Linux) Mac OS X
const char *filename =
   argv[1];
void *handle =
   dlopen(filename, RTLD_NOW);
const char *filename = argv[1];
NSObjectFileImage *handle;
NSObjectFileImageReturnCode *returnCode = 
   NSCreateObjectFileImageFromFile(filename, handle);
if (returnCode == NSObjectFileImageSuccess)
  /* 以下、自分のコードが行う他の任意の処理を行う */
int result = dlclose(handle);
DYLD_BOOL result = NSDestroyObjectFileImage(handle);
printf("%s\n", dlerror());
int *null;
NSLinkEditErrors *c;
const char **errorMsg;
NSLinkEditError(c, null,
   (const char**)lpLibFileName,errorMsg);
printf("%s\n", errorMsg);
void *address =
   dlsym(handle, symbol);
void *address = NSAddressOfSymbol(handle);

Mac OS X では、dl* の動作を完全に同じようにエミュレートする API は存在しません。既存のコードの変更を避けたい場合は、OpenDarwin プロジェクトの dlcompat ラッパを使用するという方法があります。

ヘッダファイルとフレームワーク
標準のヘッダファイルは、/usr/include にあります。Mac OS X のフレームワークは、共有ライブラリに似ており、ヘッダ、ライブラリ、その他を 1 つのフォルダに寄せ集めたものになっています。各フレームワークは、別々の場所に記憶されているため、それぞれ個別に検索する必要があります。

アップルが提供するフレームワークは、/System/Library/Frameworks/ にあります。それぞれのディレクトリには Headers という名前のディレクトリがあり、そこに共有のヘッダファイルがあります。

自分のフレームワークは、フレームワークを公開するかどうかに応じて、/Network/Library/Framework、/Library/Framework、または ~/Library/Frameworks などにインストールできます。

UNIX (Linux) Mac OS X
alloc.h stdlib.h
ftw.h fts.h (fts_open, fts_children, fts_close)
getopt.h unistd.h
lcrypt.h unistd.h
stream.h iostream.h
utmpx.h utmp.h
values.h limits.h
関数
UNIX (Linux) Nac OS X
crypt crypt 関数の Mac OS X のバージョンの動作は、128 ビット定数ではなく 64 ビット定数として暗号化する
dysize (year) %4 == 0 && ((year) %100 != 0 || (year) % 400 == 0)
ecvt、fcvt

sprintf または snprintf で代用

poll select に置き換えてコードを修正
shmget mmap の利用を推奨
Java

ProjectBuilder の Format メニューの File Encodings から No-lossy Ascii を選択してUnicode 以外のコードを UnicodeのLarin-1にしてファイルに保存するようにする。

MRJApp.properties ファイルの file.encoding を x-sjis にする。その他、改行コードを設定する line.separator やロケールを設定する user.region, user.language、パスの設定をする file.separator なども注意する。