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 のエラー リターンはすべて 3 つのコンポーネントで構成され、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)

と:

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

再びこれらの 3 つのコンポーネントがあります。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 に答える