2017-05-09 5 views
2

Ich versuche, einige Daten über einen Prozess in Swift zu erhalten. Ich verwende diesen Code als Ausgangspunkt:Informationen über den Prozess in Swift erhalten

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

von Per Process disk read/write statistics in Mac OS X genommen.

Allerdings habe ich Mühe, den Code über Swift Umwandlung:

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

Die Funktion prod_pid_rusage einen Parameter vom Typ rusage_info_t erwartet ?, aber ich kann nicht eine Instanz dieses Typs instanziiert. Kann die Funktion in Swift verwendet werden?

Grüße, Sascha

+0

statt es auf dem Stapel der Zuteilung können Sie eine auf dem Heap (zB ' var usage = UnsafeMutablePointer .allocate (Kapazität: 1)') zuzuteilen –

+0

Nein, ich kann leider nicht: „Can not pass unveränderlichen Wert vom Typ 'rusage_info_t?' als inout Argument " –

+0

Probieren Sie roc_pid_rusage (100, RUSAGE_INFO_CURRENT, & Verwendung!) –

Antwort

3

Wie in C haben Sie die Adresse eines rusage_info_current Variable zu nehmen und es auf die Art von proc_pid_rusage() erwartet gegossen. In Swift wird diese und withMemoryRebound() mit withUnsafeMutablePointer() getan:

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) 
    // ... 
} 

Sie haben

#include <libproc.h> 

zu der Überbrückungs Header-Datei hinzufügen, um es zu kompilieren zu machen.

+0

Funktioniert wie ein Charme, vielen Dank! –

Verwandte Themen