2012-02-13 42 views
-1

我打電話給sysctl()來檢索mem統計信息,並且爲void* oldVal參數,我傳入一個指向double的指針。然而,不是將double設置爲正確的值,而是將其設置爲0.00000在Unix中使用雙打?

但是,當我嘗試使用長整數完全相同的事物時,它會將其設置爲正確的狀態。爲什麼當長時間被設置爲正確的數據時,雙數被設置爲0.00000?

int systemInfoNeeded[2] = {CTL_HW, HW_PHYSMEM}; 
    size_t sizeOfBuffer = sizeof(totalAmount); 

    if (sysctl(systemInfoNeeded, 2, &totalAmount, &sizeOfBuffer, NULL, 0)) 
    { 
     NSLog(@"Total memory stat retrieval failed.\n"); 
     exit (EXIT_FAILURE); 
    } 

totalAmount是double。第二個我將totalAmount的類型改爲long,它完美的工作。無論如何,我可以得到雙倍工作?我想直接發送totalAmount,而不是發送很長的時間,然後將值分配給totalAmount

我使用的Objective-C/C,在Mac OS X雪豹和Xcode 3.2.6

+0

在此處閱讀代碼以瞭解應該如何完成:http://www.opensource.apple.com/source/gcc/gcc-5484/libiberty/physmem.c – 2012-02-13 23:36:12

回答

1

sysctl()在手冊頁中接受指定類型的指針,以查找您正在查詢的屬性。該參數被聲明爲void *,以便相同的通用接口可以使用各種屬性所期望的不同類型。這並不意味着你可以使用任何你想要的類型。在HW_PHYSMEM的情況下,它是一個整數,即一個int,顧名思義,不是很長或其他任何東西。

如果你傳遞一個long值,它的工作原理的唯一原因是因爲mac是little endian,因此long值的前四個字節與int的值相同,但是你當然不應該依賴於這個。

如果要讀取double,請轉換整數。

你應該好好看看sysctl(3)。特別注意KERN_MAXPROC的例子。注意使用int。

+0

謝謝,這有很大的幫助 – fdh 2012-02-14 01:39:05

3

你不能只選擇自己喜歡的數據類型和一個指針傳遞給它; sysctl調用需要一個指向整數的指針,所以這就是你必須提供的。如果你將一個指針傳遞給double,那麼你會得到一個double值,它表示一個整數值 - 結果是亂碼。

+0

sysctl不指望指向長。它期望一個指向數值變量的指針,這就是爲什麼它是void *而不是long *。如果我傳入一個整數,它仍然有效,所以我不明白爲什麼一個double不會。 – fdh 2012-02-13 23:26:25

+0

但沒有任何一種你想要的類型的指針,沒有辦法檢查你已經通過了什麼樣的指針,所以你必須提供一個所需的類型。 – JustSid 2012-02-13 23:30:03

+1

'sysctl(3)'的BSD手冊頁令人憤慨。爲什麼不說*哪個* integer類型的所謂「整數」值使用?你只是應該知道它是'long'(與'int'相反,它與「long」不一定是相同的大小和表示形式,因爲64位OSX使用LP64),或者你應該檢查寫入的大小通過每次調用,如果它是'sizeof(long)',你可以重新解釋數據爲'long',如果它是其他大小,重新解釋爲其他整數類型? – 2012-02-13 23:37:51