2011-12-19 18 views
7

Tôi đang cố gắng ngắt kết nối ổ đĩa trong ứng dụng Cocoa bằng cách sử dụng Khung Trọng tài Đĩa.Giải thích giá trị trả về (dissenter) khi cố gắng ngắt kết nối âm lượng trong OS X

Trước khi gọi:

DADiskUnmount(disk, 
       kDADiskUnmountOptionDefault, 
       unmountCallback, 
       self); 

tôi đăng ký một hàm callback mà có được gọi là sau đó:

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

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

Trong chức năng này, tôi cố gắng giải thích các giá trị trả về không đồng ý nhưng gặp khó khăn. Tôi cho rằng nó phải thuộc loại DAReturn và có giá trị như kDAReturnBusy Nhưng khi ví dụ: iTunes đang sử dụng khối lượng và nó không thể được unmounted "ret" có giá trị 0xc010 mà tôi không hoàn toàn hiểu.

Trong trường hợp ngắt kết nối không thành công, tôi muốn tìm hiểu lý do tại sao không thể tháo lắp âm lượng và trong trường hợp ứng dụng khác đang sử dụng, hãy nhắc người dùng đóng ứng dụng này.

Trả lời

16

Nhưng khi ví dụ: iTunes đang sử dụng khối lượng và nó không thể được unmounted "ret" có giá trị 0xc010 mà tôi không hoàn toàn hiểu.

Các tài liệu bạn liên kết đến, đối với loại DAReturn, liệt kê tất cả các hằng số đĩa Trọng tài như nhìn như thế này:

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

Vì vậy, lợi nhuận lỗi DA đều làm bằng ba thành phần , HOẶC cùng nhau.

Nếu bạn nhìn vào the documentation for DADissenterGetStatus, nó nói:

Mã trở BSD, nếu có, được mã hóa với unix_err().

Nếu bạn sau đó tìm kiếm các tiêu đề cho unix_err, bạn tìm thấy nó trong /usr/include/mach/error.h, mà nói:

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

và:

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

Có ba điểm một lần nữa. Một số macro khác có lỗi.h sắp xếp giá trị hệ thống và hệ thống con (ví dụ: err_kernerr_sub(3)) vào các vị trí đó.

Vì vậy, bây giờ, chúng ta hãy mở Calculator, nhấn ⌘3 để đặt nó vào chế độ lập trình viên, chuyển nó đến căn-16, và gõ mã lỗi của bạn, và xem những gì nó nói:

0xC010

0000 0000 0000 0000 1100 0000 0001 0000 
31     15    0 

Breaking rằng ngoài theo cách bố trí trên, chúng ta thấy:

0000 00 
31  

Hệ thống: 0, lỗi nào.h nói là err_kern. Lỗi này đến từ hạt nhân.

 00 0000 0000 11 
31     15 

Subsystem: 3 (0b11). Điều này cộng với mã hệ thống phù hợp với định nghĩa đã nói ở trên của unix_err. Vì vậy, đây là mã trả về BSD, như DADissenterGetStatus cho biết.

     00 0000 0001 0000 
31     15    0 

mã lỗi cá nhân: 16 (0x10, 0b10000).

lỗi UNIX/BSD được định nghĩa trong <sys/errno.h>, mà nói:

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

này gợi ý với tôi rằng bạn không thể tháo gắn thiết bị đó bởi vì nó đang được sử dụng.

+1

(Bạn muốn cung cấp cho bạn thêm điểm cho hướng đi chu đáo mà mọi người hệ thống mới sẽ thấy tại một số điểm.) –

+1

@quixoto vui lòng cung cấp tiền thưởng cho câu hỏi và trao giải thưởng cho Peter :) –

+0

Cảm ơn rất, rất nhiều Peter cho câu trả lời toàn diện của bạn. Đây chính xác là thông tin tôi đang tìm kiếm !! – JLinX

Các vấn đề liên quan