Apple Developer Connection
Advanced Search
Member Login Log In | Not a Member? Contact ADC

< Previous PageNext Page >

翻訳されたアプリケーションをプログラムで検出する

アプリケーションがRosettaを使用して実行しているかどうかを、プログラムで判断したい場合があります。たとえば、デバイスインターフェイスコードを作成する開発者は、ユーザクライアントがカーネルと同じエンディアンフォーマットを使っているか判断が必要な場合があります。

Listing A-3は、プロセスID(pid)でsysctlbyname関数を呼び出せるユーティリティルーチンです。プロセスID 0をルーチンに渡すと、現在のプロセスで呼び出しを実行します。それ以外では、渡すpidの値で指定されるプロセスで、呼び出しを実行します。(sysctlbynameの詳細については、Mac OS X Man Pagesを参照してください)。Listing A-4で示すis_pid_nativeルーチンは、文字列「sysctl.proc_native」を渡してルーチンを呼び出します。

Listing A-3  sysctlbyname関数を呼び出すユーティリティルーチン

static int sysctlbyname_with_pid (const char *name, pid_t pid, 
                            void *oldp, size_t *oldlenp, 
                            void *newp, size_t newlen)
{
    if (pid == 0) {
        if (sysctlbyname(name, oldp, oldlenp, newp, newlen) == -1)  {
            fprintf(stderr, "sysctlbyname_with_pid(0):sysctlbyname  failed:"
                     "%s\n", strerror(errno));
            return -1;
        }
    } else {
        int mib[CTL_MAXNAME];
        size_t len = CTL_MAXNAME;
        if (sysctlnametomib(name, mib, &len) == -1) {
            fprintf(stderr, "sysctlbyname_with_pid:sysctlnametomib  failed:"
                     "%s\n", strerror(errno));
            return -1;
        }
        mib[len] = pid;
        len++;
        if (sysctl(mib, len, oldp, oldlenp, newp, newlen) == -1)  {
            fprintf(stderr, "sysctlbyname_with_pid:sysctl  failed:"
                    "%s\n", strerror(errno));
            return -1;
        }
    }
    return 0;
}

Listing A-4では、指定のプロセスがネイティブに実行されているのか、翻訳されて実行されているのかを判断するルーチンを示します。

Listing A-4  実行しているプロセスが、ネイティブなのか翻訳されているのか判断するルーチン

int is_pid_native (pid_t pid)
{
    int ret = 0;
    size_t sz = sizeof(ret);
 
    if (sysctlbyname_with_pid("sysctl.proc_native", pid, 
                &ret, &sz, NULL, 0) == -1) {
         if (errno == ENOENT) {
            // sysctlが存在しないのでMac OSのバージョンは
            // Rosettaより前。つまり、アプリケーションはネイティブで実行。
            return 1;
        }
        fprintf(stderr, "is_pid_native:sysctlbyname_with_pid  failed:"
                "%s\n", strerror(errno));
        return -1;
    }
    return ret;
}


< Previous PageNext Page >


Last updated: 2006-03-08




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
Get information on Apple products.
Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Copyright © 2007 Apple Inc.
All rights reserved. | Terms of use | Privacy Notice