c - 如何删除硬盘驱动器

标签 c linux erase hard-drive

这是一个奇怪的问题,但就是这样。我想编写一个程序,用 1s 然后用 0s 闪存我的外部硬盘驱动器以完全清理它,以便我可以出售它。现在,为什么我要编写自己的软件而不是仅仅使用 DBAN?

  1. 据我了解,DBAN 会删除它检测到的所有硬盘驱动器。我只想清洁我的外部。

  2. DBAN 闪烁七次。我觉得这对我的目的来说有点过分,因为我的外部不包含非法 Material 或信用卡信息。

  3. 老实说,我其实有点好奇固件是如何工作的。

Google 并没有出现太多(愚蠢的 Adob​​e Flash)。我更喜欢在 C/C++ 中执行此操作,但其他语言也可以,包括汇编语言。

最佳答案

好吧,用 C 来做这件事相当容易。首先,以写入模式打开相应的设备文件:

int fd = open("/dev/sdc", O_WRONLY);

然后您只需write() 512 字节 block 到它,直到您不能再写入为止。较新的磁盘改为使用 4096 字节扇区,但操作系统通常将它们视为具有 512 字节扇区,因此 512 是最安全的值。这是一个 C 程序,正是这样做的:

(注意:非常要小心选择正确的/dev 设备文件,否则您将删除错误的磁盘!)

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(void)
{
    int fd = open("/dev/sdd", O_WRONLY);
    if (fd < 0) {
        fprintf(stderr, "Error opening device file.\n");
        return EXIT_FAILURE;
    }

    // Write 0's all over the disk, in chunks of 512 bytes.
    char* zeros = calloc(1, 512);
    ssize_t written, total = 0;
    do {
        total += written = write(fd, zeros, 512);
        printf("\rBytes written: %ld", total);
    } while (written == 512);
    printf("\nDone!\n");

    close(fd);
    free(zeros);
    return 0;
}

如果您删除 printf(),您可能会得到加速,尽管在它发生时看到进度有​​点酷。您可能还应该在最后进行额外的错误检查(如果 written 为 -1,则发生错误,您应该检查 errno。)

请注意,由于缓存的缘故,程序在打印“完成”后可能会在最后挂起一会儿。它并不是真正挂起,只是写入操作的缓存在它们全部完成之前阻塞它。

关于c - 如何删除硬盘驱动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13390843/

相关文章:

c - 填充指向整数的指针数组

c++ - 在 linux 上的 c++ 代码中通过 sendfile() 复制的速度是多少?

c++ - vector::erase() 会改变位置吗?

c++ - 如何删除和删除指向 vector 中存储的对象的指针?

C 添加到双指针数组

c++ - 二叉搜索树 - 访问冲突

linux - 如何从 awk 选择值的文件中打印文件名?

c++ - 使用 'this' 关键字从 vector 中删除元素

c - 假设 char *p = "hello world",那么在 '\0' 之后是否存在任何 'd' ?

linux - 如何在 Linux 上临时捕获我自己进程的标准输出?