linux下获取硬盘序列号

最近在弄加密解密的,然后需要用到硬盘序列号,一路遇到两个问题,查了很多的资料都没有得到的很好的答案,先简单的说一下这两个问题:
1、用linux命令能否查询到硬盘序列号?
2、使用linux C获取硬盘序列号怎么弄,有大神能简单的说一下这方面的知识和思路吗?文字或者网址都可以,需要切实可行的那种。
希望这个问题最终能结贴,给别人一些帮助,开源,分享~

第一个问题:
http://zhidao.baidu.com/link?url=dkoJVvaUlq--hYwayrna-jaQ9Z_gp5ZLt1Qd6tZOagj_93dXY-sjzcTMM-lscexTqBrkasVsbT6pA7CZMCXZY_

都二个问题:
http://bbs.csdn.net/topics/390650082?page=1

另外附上,奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中!

#include
#include
#include
#include
#include
#include
#include
#include

static int getdiskid (char *id, size_t max)
{
int fd;
struct hd_driveid hid;
FILE *fp;
char line[0x100], *disk, *root, *p;

fp = fopen ("/etc/mtab", "r");
if (fp == NULL)
{
    fprintf (stderr, "No /etc/mtab file.\n");
    return -1;
}

fd = -1;
while (fgets (line, sizeof line, fp) != NULL)
{
    disk = strtok (line, " ");
    if (disk == NULL)
{
    continue;
}

    root = strtok (NULL, " ");
    if (root == NULL)
{
    continue;
}

    if (strcmp (root, "/") == 0)
{
    for (p = disk + strlen (disk) - 1; isdigit (*p); p --)
        {
            *p = '\0';
        }
    fd = open (disk, O_RDONLY);
    break;
}
}

fclose (fp);

if (fd < 0)
{
    fprintf (stderr, "open hard disk device failed.\n");
    return -1;
}

if (ioctl (fd, HDIO_GET_IDENTITY, &hid) < 0)
{
    fprintf (stderr, "ioctl error.\n");
    return -1;
}

close (fd);

snprintf (id, max, "%s", hid.serial_no);
fprintf (stdout, "get hard disk serial number: %s\n", id);
return 0;

}

int main()
{
char dsk_id[256];
getdiskid(dsk_id, sizeof(dsk_id));
return(0);
}


这个是在网上搜来的一个代码,但是存在一些问题
然后在使用linux命令查询硬盘信息的时候,得到的最多的是说用
hdparm-i/dev/sda
查询,但是在Ubantu虚拟机下查询不到,

初步查询了可爱的白萝卜关于第二问提供的代码,自己改了一下成功获取了,但是他那个代码是直接查询相应的硬盘名称,然后调用system()函数来创建一个子进程,子进程利用fork()函数实现,这些都是linux系统自己实现的,那么问题来了,虽然它能够创建进程打印出序列号,我怎么把它自动存放到数组中去呢?这个创建进程的调用是有system()函数实现的,并不是由我们的代码实现的。求路过的大神指点啊~