2011-12-19 10 views
7

Sto tentando di smontare un volume nella mia applicazione Cocoa utilizzando Disk Arbitration Framework.Interpretare il valore di ritorno (dissenter) quando si tenta di smontare il volume in OS X

Prima di chiamare:

DADiskUnmount(disk, 
       kDADiskUnmountOptionDefault, 
       unmountCallback, 
       self); 

mi registro una funzione di callback che ottengono è chiamato in seguito:

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

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

In questa funzione cerco di interpretare il valore di ritorno dissenziente, ma rimanere bloccati. Suppongo che dovrebbe essere di tipo DAReturn e avere un valore come kDAReturnBusy Ma quando ad es. iTunes sta usando il volume e non può essere smontato "ret" ha un valore di 0xc010 che non capisco.

Nel caso in cui lo smontaggio non riesca mi piacerebbe scoprire perché il volume non può essere smontato e nel caso in cui un'altra applicazione lo stia utilizzando, ricorda all'utente di chiudere questa applicazione.

risposta

16

Ma quando ad es. iTunes sta usando il volume e non può essere smontato "ret" ha un valore di 0xc010 che non capisco.

La documentazione si è collegato al, per il tipo di DAReturn, elenca tutte le costanti di arbitrato come disco di simile a questo:

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

Quindi, ritorna errore di DA sono tutti realizzati in tre componenti , OR insieme.

Se si guarda the documentation for DADissenterGetStatus, si dice:

Un codice di ritorno BSD, se del caso, è codificato con unix_err().

Se quindi cercare le intestazioni per unix_err, a trovarlo in /usr/include/mach/error.h, che dice:

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

e:

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

Ecco quelle tre com ancora dei ponenti. Alcune altre macro in error.h organizzano i valori di sistema e di sottosistema (ad es., err_kern e err_sub(3)) in quelle posizioni.

Così ora, cerchiamo di aprire la calcolatrice, premere ⌘3 per metterlo in modalità programmatore, accenderlo basare-16, e digitare il codice di errore, e vedere che cosa dice:

0xC010

0000 0000 0000 0000 1100 0000 0001 0000 
31     15    0 

rottura che a parte a seconda del layout di cui sopra, troviamo:

0000 00 
31  

Sistema: 0, che error.h dice è err_kern. Questo errore proviene dal kernel.

 00 0000 0000 11 
31     15 

Subsystem: 3 (0b11). Ciò più il codice di sistema corrisponde alla suddetta definizione di unix_err. Quindi questo è un codice di ritorno BSD, come detto DADissenterGetStatus.

     00 0000 0001 0000 
31     15    0 

codice di errore individuale: 16 (0x10, 0b10000).

UNIX/BSD errori sono definiti in <sys/errno.h>, che dice:

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

Questo mi fa pensare che non si può smontare quel dispositivo perché è in uso.

+1

(Vorrei darti dei punti extra per la soluzione ponderata che ogni nuovo sistemista dovrebbe vedere ad un certo punto.) –

+1

@quixoto sentiti libero di offrire una taglia sulla domanda e poi assegnarla a Peter :) –

+0

Grazie mille molto, molto Peter per la tua risposta esauriente. Questa è esattamente l'informazione che stavo cercando !! – JLinX

Problemi correlati