0

マウントされていない、または他の方法で使用されていないドライブのスピンダウンが必要なプログラムがあります。

ファイル記述子を閉じると、ドライブが自動的にスピンアップすることに気付きました。

これが原因であるという情報は見つかりませんでした。これを無効にする方法はありますか?

これは、自分でテストするための短いプログラムです。ヘルプやポインタをいただければ幸いです

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <scsi/sg.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    sg_io_hdr_t io_hdr;
    const unsigned char     stopcmdblk[6]        =     { 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00 };

    int fd = open(argv[1], O_RDWR);
    if (fd == -1) {
        perror("couldn't open device");
        exit(1);
    }

    memset(&io_hdr, 0, sizeof(sg_io_hdr_t));
    io_hdr.interface_id = 'S';
    io_hdr.cmd_len = 6;
    io_hdr.mx_sb_len = 32;
    io_hdr.dxfer_direction = SG_DXFER_NONE;
    io_hdr.dxfer_len = 0;
    io_hdr.dxferp = NULL;
    io_hdr.cmdp = malloc(6);
    io_hdr.sbp = calloc(32, 1);

    memcpy(io_hdr.cmdp, stopcmdblk, 6);

    errno = 0;
    int ret = ioctl(fd, SG_IO, &io_hdr);
    if (ret < 0) { 
        perror("ioctl error");
        exit(1);
    }

    if ((io_hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK) {
        printf("SCSI err\n");
        exit(1);
    }

    printf("finished spindown\n");

    sleep(30);

    printf("close file now\n");

    close(fd);
    printf("file closed\n");

    exit(0);

}
4

1 に答える 1

1

ファイルが閉じられたときに、システムが何らかのメタデータをディスクに書き込もうとしていると思います。たとえば、ファイル サイズ -write呼び出しのたびにファイル サイズを更新するのは無意味に思えます。そのため、通話中に更新されcloseます。

syncシステムコールが必要だと思います。fsync1 つのファイルだけで機能するバリアントもあります。ただし、それはファイル記述子に関するものではありません。ドライブを削除したいので、すべてのファイル記述子を処理する必要があります。

于 2014-12-18T19:10:25.123 に答える