8

我正在尝试使用磁盘仲裁框架在我的 Cocoa 应用程序中卸载卷。

打电话前:

DADiskUnmount(disk, 
              kDADiskUnmountOptionDefault, 
              unmountCallback, 
              self );

我注册了一个之后调用的回调函数:

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

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

在这个函数中,我尝试解释异议者返回值但被卡住了。我想它应该是 DAReturn 类型并且具有类似kDAReturnBusy的值但是当例如 iTunes 正在使用该卷并且它不能被卸载时,“ret”的值是 0xc010,我不太明白。

如果卸载失败,我想找出无法卸载该卷的原因,如果另一个应用程序正在使用它,请提醒用户关闭该应用程序。

4

1 回答 1

18

但是,当 iTunes 正在使用该卷且无法卸载时,“ret”的值为 0xc010,我不太明白。

对于该DAReturn类型,您链接到的文档列出了所有磁盘仲裁常量,如下所示:

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

所以,DA 的错误返回都是由三个部分组成的,或者一起。

如果您查看的文档DADissenterGetStatus,它会说:

BSD 返回码(如果适用)使用 unix_err() 编码。

如果您随后在标头中搜索unix_err,您会在 /usr/include/mach/error.h 中找到它,其中显示:

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

和:

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

又是这三个组件。error.h 中的一些其他宏将系统和子系统值(例如,err_kernerr_sub(3))安排到这些位置。

所以现在,让我们打开计算器,按 ⌘3 进入程序员模式,将其切换到 base-16,然后输入错误代码,看看它显示了什么:

0xC010

0000 0000 0000 0000 1100 0000 0001 0000
31                  15                0

根据上面的布局分解,我们发现:

0000 00
31     

系统:0,error.h 说的是err_kern. 此错误来自内核。

       00 0000 0000 11
31                  15

子系统:3 (0b11)。这加上系统代码与上述定义相匹配unix_err。因此,如前所述,这是一个 BSD 返回码DADissenterGetStatus

                      00 0000 0001 0000
31                  15                0

个别错误代码:16 (0x10, 0b10000)。

UNIX/BSD 错误在 中定义<sys/errno.h>,其中表示:

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

这向我表明您无法卸载该设备,因为它正在使用中。

于 2011-12-19T19:20:54.123 回答