c - fread 从 Linux 磁盘读取扇区时返回 0

标签 c linux ubuntu

我正在尝试从 读取一个扇区/dev/sda Ubuntu 上的磁盘,但 fread 总是返回 0,我似乎无法理解它为什么这样做,
这是读取扇区的代码:


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>

 void read_sector(char *physical_disk, int num_sec) {
     char *diskName = "/dev/";
     char *ch1 = strstr(physical_disk,"sd");
     char *ch2 = strstr(physical_disk,"hd");
     if((ch1==NULL) && (ch2 == NULL)) {
        printf("Error, that is not a physical disk's name. \n");
        }
     else {
           int sect,n;
           int len = strlen(diskName) + strlen(physical_disk) + 2;
           char *str = (char*)malloc(len);
           strcpy(str,diskName);
           unsigned char buffer[512];
           long int sec = 512*num_sec;
           FILE *disk = NULL;
           strcat(str, physical_disk);
           disk = fopen(diskName, "rb");
           if (disk==NULL) printf("error, disk can't be opened \n");
           else {
                 sect = fseek(disk, sec, SEEK_SET);
                 if(sect != 0) printf("fseek error %d \n", sect);
                 else {
                       n = fread(buffer,512,1,disk);                        
                       if(n<=0) printf("fread error %d \n", n);
                       else printf("number of elements read : %d \n", n);
                      }
                }
                fclose(disk)
          }

}

int main(int argc, char const *argv[])
{
  read_sector("sda", 3);
  return(0);
}
  
关于它为什么返回 0 的任何想法?非常感谢你!

最佳答案

我没有编译这段代码,因为它只是片段。但是您是否有权实际读取设备?
您可以使用以下命令执行此操作。

id

uid=1001(user) gid=1001(user) groups=1001(user),27(sudo)

user@host01:~$ ls -la /dev/sda
brw-rw---- 1 root disk 253, 0 Jun 1 01:46 /dev/sda

user@host01:~$ dd if=/dev/sda of=/dev/null

dd: failed to open '/dev/sda': Permission denied
如果您排除了许可,那么我们可以进一步查看代码。

关于c - fread 从 Linux 磁盘读取扇区时返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62621055/

相关文章:

linux - Chef 服务器安装问题

php - 保存动态规划状态的算法

linux - 解释 gfortran 错误回溯

c - 结构链接表分段-故障

c - 如何在事件(单击)时清除输入框

亚马逊 ec2 上的 PHP 和 Python

linux - 在没有 sudo 访问权限的情况下安装 Google glog 库

python - 在 Ubuntu 上安装 Anaconda,出现 BrokenProcessPool 错误

c - 使用降雪包在 R 中使用 C-within-R 函数进行并行计算。问题 : Mac shows loading wheels and almost freezes

c - 将 "too many"参数传递给外部函数是否安全?