尝试在OS X中卸载卷时解释返回值(反对者)

Jan*_*ler 8 cocoa objective-c diskarbitration

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

致电之前:

DADiskUnmount(disk, 
              kDADiskUnmountOptionDefault, 
              unmountCallback, 
              self );
Run Code Online (Sandbox Code Playgroud)

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

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

        switch (ret) {
        case kDAReturnBusy:
            printf("kDAReturnBusy\n");
            break;
    } 
}
Run Code Online (Sandbox Code Playgroud)

在这个函数中,我尝试解释反对者返回值但是卡住了.我认为它应该是DAReturn类型并且具有类似kDAReturnBusy的值但是当例如iTunes正在使用该卷并且它无法卸载时"ret"具有值0xc010,我不太明白.

如果卸载失败,我想找出无法卸载卷的原因,以及其他应用程序使用它时提醒用户关闭此应用程序.

Pet*_*sey 17

但是,当iTunes使用该卷并且无法卸载时,"ret"的值为0xc010,我不太明白.

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

    kDAReturnError = err_local | err_local_diskarbitration | 0x01, /* ( 0xF8DA0001 ) */
Run Code Online (Sandbox Code Playgroud)

因此,DA的错误返回全部由三个组件组成,一起进行OR运算.

如果您查看文档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)
Run Code Online (Sandbox Code Playgroud)

和:

/*
 *    error number layout as follows:
 *
 *    hi                     lo
 *    | system(6) | subsystem(12) | code(14) |
 */
Run Code Online (Sandbox Code Playgroud)

再次有这三个组成部分.error.h中的一些其他宏将系统和子系统值(例如,err_kernerr_sub(3))排列到这些位置.

现在,让我们打开计算器,按⌘3将其置于编程模式,将其切换到base-16,然后键入错误代码,看看它的内容:

0xC010

0000 0000 0000 0000 1100 0000 0001 0000
31                  15                0
Run Code Online (Sandbox Code Playgroud)

根据以上布局打破这一点,我们发现:

0000 00
31     
Run Code Online (Sandbox Code Playgroud)

系统:0,error.h表示err_kern.此错误来自内核.

       00 0000 0000 11
31                  15
Run Code Online (Sandbox Code Playgroud)

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

                      00 0000 0001 0000
31                  15                0
Run Code Online (Sandbox Code Playgroud)

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

定义了UNIX/BSD错误<sys/errno.h>,其中说:

#define EBUSY       16      /* Device / Resource busy */
Run Code Online (Sandbox Code Playgroud)

这告诉我你无法卸载该设备,因为它正在使用中.

  • (想要为每个新系统人员在某些方面看到的深思熟虑的演练提供额外的分数.) (2认同)