/bin/cpはブロックデバイスをどのように処理しますか?

/bin/cpはブロックデバイスをどのように処理しますか?

を使用すると、引数の/bin/cp source_file destination_file1つはブロック特殊です。

ベストアンサー1

  • ソースファイルが通常のファイルで、ターゲットブロックデバイスがある場合(そして-iコマンドラインスイッチがない場合、または-iの肯定がない場合)、POSIXは[1]ターゲットをO_WRONLY |でopen()する必要があると言います。 O_TRUNC、そしてソースコードの内容を書き込みます。 POSIXは、[2] O_TRUNC(および他の特別な場合)でopen()されたブロックデバイスの動作が定義された実装であり、私の経験では通常最初から上書きされ、ソースがある場合、残りは変更されないと言います。小さいです。 GNU cpには--remove-destinationコマンドラインスイッチもあります。このスイッチは、ソースファイルが通常のファイルであり、ターゲットブロックデバイスが通常のファイルである場合は、まずターゲットのリンクを解除()してから、その場所に通常のファイルを作成します。

  • ソースファイルがブロックデバイスで、-Rコマンドラインスイッチが使用されている場合、POSIXはターゲットがソースと同じファイル形式で生成されることを示します。これは通常、対応するデフォルト:補助ターゲットを持つmknod()です。

  • 難しい部分は、ソースファイルがブロックデバイスであり、-RがないときにPOSIXがそれを無視するようです。 FreeBSD実装[4]はターゲットをopen()して内容を書き込みます。対照的に、GNU [3]はデフォルトでmknod()ターゲットを使用するか、--copy-contentsが使用されている場合はopen()を実行してコンテンツを作成します。


[1] cp.1posix、POSIX.1-2017シェルとユーティリティhttps://pubs.opengroup.org/onlinepubs/9699919799/utilities/cp.html

[2]オープン.3posix

[3] cp、GNU Coreutilshttps://www.gnu.org/software/coreutils/manual/html_node/cp-inspirion.html

'-R' '-r' '--recursive' (...) ソースファイルと同じタイプのターゲットファイルを作成して特殊ファイルをコピーします。 --copy-contents オプションをご覧ください。

テキストは「info」形式の文書にありますが、「man」形式にはありません。

[4] freebsd 配布/12.1.0https://github.com/freebsd/freebsd/blob/release/12.1.0/bin/cp/cp.c#L461

        case S_IFBLK:
        case S_IFCHR:
            if (Rflag && !sflag) {
                if (copy_special(curr->fts_statp, !dne))
                    badcp = rval = 1;
            } else {
                if (copy_file(curr, dne))
                    badcp = rval = 1;
            }

int copy_special()そしてint copy_file()bin/cp/utils.cで定義されています。 1つはmknod()、もう1つはopen()で内容を作成します。


Toybox(Androidに同梱されているBSDライセンスビジーボックスマルチコール代替製品)は常にコンテンツを作成しているようです。後で詳しく調べてみましょう。

おすすめ記事