2017-05-09 2 views
2

Swiftのプロセスに関するデータを取得しようとしています。 私は出発点として、このコードを使用しています:Swiftのプロセスに関する情報の取得

Per Process disk read/write statistics in Mac OS Xから取ら
pid_t pid = 10000; 
rusage_info_current rusage; 
if (proc_pid_rusage(pid, RUSAGE_INFO_CURRENT, (void **)&rusage) == 0) 
{ 
    cout << rusage.ri_diskio_bytesread << endl; 
    cout << rusage.ri_diskio_byteswritten << endl; 
} 

を。

しかし、私はトラブルスイフトに上記のコードを変換があります

var usage = rusage_info_v3()  
if proc_pid_rusage(100, RUSAGE_INFO_CURRENT, &usage) == 0 
{ 
    Swift.print("Success") 
} 

機能prod_pid_rusageが型rusage_info_tのパラメータを期待?私はそのタイプのインスタンスをインスタンス化することができません。 Swiftでこの機能を使用することはできますか?

よろしく、 サシャ

+0

、あなたはヒープ上の1を割り当てることができます(例えば、 ' VARの使用量= UnsafeMutablePointer .allocate(容量:1)') –

+0

いいえ、残念ながら私はできません:「することはできません'rusage_info_t'型の不変の値を渡します。 inoutの引数として " –

+0

roc_pid_rusage(100、RUSAGE_INFO_CURRENT、&usage!)を試してください –

答えて

3

あなたはrusage_info_current 変数のアドレスを取得し、proc_pid_rusage()が期待する型にキャストする必要がCです。スウィフトは これはwithUnsafeMutablePointer()withMemoryRebound()を使用して行われます:

let pid = getpid() 
var usage = rusage_info_current() 

let result = withUnsafeMutablePointer(to: &usage) { 
    $0.withMemoryRebound(to: rusage_info_t?.self, capacity: 1) { 
     proc_pid_rusage(pid, RUSAGE_INFO_CURRENT, $0) 
    } 
} 
if result == 0 { 
    print(usage.ri_diskio_bytesread) 
    // ... 
} 

あなたはそれをコンパイルするために、ブリッジングヘッダファイルに

#include <libproc.h> 

を追加する必要があります。代わりに、それをスタックに割り当てる

+0

魅力のように動作します、ありがとうございます! –

関連する問題