2014-12-18 79 views
0

我有一个程序,其中没有安装或以任何其他方式使用的驱动器需要spindown。文件描述符关闭后SCSI驱动器spinup

我注意到驱动器在关闭filedescriptor后自动启动。

我还没有找到任何信息为什么这是,有什么办法可以禁用这个?

这里有一个简短的程序来测试它自己。任何帮助或指针,将不胜感激

#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); 

} 
+0

难道是文件系统维护磁盘上的文件锁定信息(隐藏的锁文件或类似的)?您打开文件R/W,以便它必须被锁定。访问磁盘的网络上的其他Linux节点可以读取此信息以确定它们是否可以安全地访问该文件。然后,当你关闭文件时,启动是这样的,锁可以从磁盘上删除。 –

+0

是否有可能在文件关闭后强制锁定?减速后,驱动器将被删除,无论如何 –

回答

1

我猜系统想写一些元数据磁盘时,文件关闭。例如,文件大小 - 在每次调用write后更新文件大小似乎毫无意义。所以它在close电话上更新。

我认为你需要系统调用sync。还有一个fsync变种只适用于一个文件;但是,这不是关于你的文件描述符;你想删除驱动器,所以全部文件描述符应该照顾。

+0

这将是相当奇怪的,因为我从来没有写任何东西到磁盘。 –

+0

也许它写了类似“上次访问文件的时间”?写入文件系统的 – anatolyg

+0

不是直接写入设备。 –

相关问题