2011-12-19 4 views
7

Próbuję odmontować wolumin w mojej aplikacji Cocoa przy użyciu Disk Arbitration Framework.Interpretowanie wartości zwracanej (dyskretny) podczas próby odmontowania woluminu w OS X

Przed skontaktowaniem:

DADiskUnmount(disk, 
       kDADiskUnmountOptionDefault, 
       unmountCallback, 
       self); 

zarejestrować funkcję zwrotną, że nazywa się potem:

void unmountCallback(DADiskRef disk, DADissenterRef dissenter, void *context) 
{ 
    if (dissenter != NULL) 
    { 
     DAReturn ret = DADissenterGetStatus(dissenter); 

     switch (ret) { 
     case kDAReturnBusy: 
      printf("kDAReturnBusy\n"); 
      break; 
    } 
} 

w tej funkcji staram się interpretować wartości zwracanej dysydent ale utknąć. Przypuszczam, że powinno to być typu DAReturn i mieć wartość taką jak kDAReturnBusy Ale np. iTunes używa woluminu i nie można go odmontować "ret" ma wartość 0xc010, której nie całkiem rozumiem.

W przypadku, gdy odmontowanie nie powiedzie się, chciałbym się dowiedzieć, dlaczego nie można odmontować woluminu, a jeśli inna aplikacja go używa, przypomina użytkownikowi o zamknięciu tej aplikacji.

Odpowiedz

16

Ale np. iTunes używa woluminu i nie można go odmontować "ret" ma wartość 0xc010, której nie całkiem rozumiem.

Dokumentacja jesteś powiązany, dla typu DAReturn listę wszystkich stałych arbitrażowe Disk jak wygląda tak:

kDAReturnError = err_local | err_local_diskarbitration | 0x01, /* (0xF8DA0001) */ 

Więc wraca błędach DA są wykonane z trzech komponentów OR razem.

Jeśli spojrzeć na the documentation for DADissenterGetStatus, to mówi:

BSD kod zwrotny, jeśli ma to zastosowanie, jest zakodowany z unix_err().

Jeśli następnie przeszukać nagłówki unix_err, go znaleźć w /usr/include/mach/error.h, który mówi:

/* unix errors get lumped into one subsystem */ 
#define unix_err(errno)  (err_kern|err_sub(3)|errno) 

oraz:

/* 
* error number layout as follows: 
* 
* hi      lo 
* | system(6) | subsystem(12) | code(14) | 
*/ 

Są te trzy com Ponownie ponownie. Niektóre inne makra w error.h układają wartości systemowe i podsystemowe (np. err_kern i err_sub(3)) w tych pozycjach.

Więc teraz otwórzmy kalkulatora, naciśnij ⌘3 aby umieścić go w trybie programatora, należy je oprzeć-16, a następnie wpisz kod błędu, i zobaczyć, co jest napisane:

0xC010

0000 0000 0000 0000 1100 0000 0001 0000 
31     15    0 

Łamanie że oprócz według powyższego układu, możemy znaleźć:

0000 00 
31  

System: 0, który error.h mówi: err_kern. Ten błąd pochodzi z jądra.

 00 0000 0000 11 
31     15 

Podsystem: 3 (0b11). To plus kod systemu odpowiada wyżej wymienionej definicji unix_err. To jest kod powrotu BSD, jak powiedział DADissenterGetStatus.

     00 0000 0001 0000 
31     15    0 

Indywidualny kod błędu: 16 (0x10, 0b10000).

UNIX/BSD błędy są zdefiniowane w <sys/errno.h>, który mówi:

#define EBUSY  16  /* Device/Resource busy */ 

To sugeruje mi, że nie można odmontować tego urządzenia, ponieważ jest w użyciu.

+1

(Chciałbym dać ci dodatkowe punkty za przemyślaną poradę, którą każdy nowy system powinien zobaczyć w pewnym momencie.) –

+1

@quixoto nie krępuj się zaoferować nagrodę w tej sprawie, a następnie nagródź ją Peter :) –

+0

Dziękuję bardzo, bardzo, Peter za wyczerpującą odpowiedź. To jest dokładnie ta informacja, której szukałem !! – JLinX