|
|
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
|
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 |