当 close() 操作留下仍等待响应的未完成 SCSI 命令时,sg 驱动程序会为其现在已失效的文件描述符维护其内部结构。这些内部结构会一直维护到收到所有未完成的响应(某些可能是超时)。当 sg 驱动程序作为模块加载并且有任何打开的文件描述符或“失效”的文件描述符时,它无法被卸载。尝试调用 rmmod sg 将报告驱动程序正忙。可以使用 cat /proc/scsi/sg/debug 命令观察长时间存在的失效文件描述符,这些文件描述符可能正在等待超时。在这种情况下,失效文件描述符上将设置“closed=1”[参见 第 11.1 节]。失效的文件描述符不会妨碍应用程序尝试在同一 SCSI 设备上 open() 新的文件描述符。
内核安排仅将文件描述符上的最后一次 close() 操作传递给驱动程序(为了强调这一点,相应的 sg 驱动程序调用被命名为 sg_release() 而不是 sg_close())。这仅在应用程序使用 fork() 或 dup() 时才重要。
如果成功则返回 0,否则 -1 表示错误。